Использование пользовательского типа упаковки в качестве зависимости в maven

#java #maven #maven-plugin

#java #мавен #maven-плагин

Вопрос:

Я создал пользовательский тип упаковки в своем плагине maven, чтобы я мог развертывать файлы в этом пользовательском формате.

Например, у меня есть проект, который использует этот формат для упаковки. В pom.xml имеет:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>mybin</packaging>
....
 

Я могу успешно выполнить развертывание в репозитории. Но теперь я хочу использовать это как зависимость в другом проекте.

Например, добавив что-то вроде этого:

 <dependency>
            <groupId>com.example</groupId>
            <artifactId>mylib</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>mybin</type>
        </dependency>
 

Это работает нормально, также за исключением того, что mybin формат включает некоторые вложенные ресурсы, такие как файлы jar), которые я хотел бы включить в путь к классу.

Я до сих пор пытался программно извлечь банки из mojo и программно добавить их в проект, используя project.getModel().addDependency(systemJarDep) , но это, похоже, не улавливается компилятором.

Как это можно сделать в Maven?

Комментарии:

1. Почему вы обрабатываете файлы jar как ресурсы? Почему бы не позволить Maven разрешить их транзитивно?

2. У меня есть пользовательский формат файла, который в основном представляет собой zip-файл с вложенными ресурсами. Некоторые из этих вложенных ресурсов представляют собой файлы jar, которые я хотел бы включить в путь к классу.

3. Если jar находится внутри zip, это не сработает…

4. Итак, нет API, который я мог бы реализовать в плагине, который позволил бы мне переопределить способ разрешения ресурсов? Существует ли какой-либо другой тип зависимости, кроме jar, который поддерживает добавление в путь к классу?

5. Я все еще не понимаю, почему вы помещаете банки в zip. Почему бы не объявить их в POM и позволить Maven выполнить разрешение?

Ответ №1:

Кажется, что такого рода вещи не могут быть выполнены в Maven.

Я решаю свою проблему, настраивая формат моего пользовательского типа пакета так, чтобы он был самим файлом jar со всеми классами, которые я хочу, в пути к классам непосредственно внутри него. Другие вложенные ресурсы, которые мне не требуются в пути к классу (по крайней мере, по умолчанию), объединены внутри каталога META-INF.

Это не идеально, но на данный момент это приемлемое решение.

Комментарии:

1. Ресурсы принадлежат корню JAR, а не каталогу META-INF. Теперь, что вы собираетесь заново изобрести maven-shade-plugin (который имеет некоторые недостатки и т.д.)

2. @khmarbaise Эти ресурсы не должны быть доступны в пути к классу. Это не изобретение плагина shade заново. Эти ресурсы должны быть доступны только нашему плагину и использоваться для определенных целей. Если я помещу их в корень jar, мне придется выполнить дополнительную работу во всех целях, чтобы отфильтровать их.

3. Итак, вы уже нарушаете стандарты JAR… Каталог META-INF не предназначен для ресурсов. Итак, я вижу.. это зависит от вас…

4. @khmarbaise Исходный «устаревший» формат файла не нарушал никаких стандартов JAR, потому что это не был jar. Ограничения Maven в этой области вынудили меня переформатировать его как jar, поскольку это единственное, что понимает maven. При этом у меня нет другого выбора, кроме как «нарушать» стандарты.

5. Проведя еще немного исследований, мы обнаружили, что включение ресурсов в META-INF вообще не нарушает стандарты JAR. Фактически, это место, где банки с несколькими выпусками размещают свои файлы .class, зависящие от версии. nipafx.dev/multi-release-jars-multiple-java-versions