#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