#java #eclipse #maven
#java #eclipse #maven
Вопрос:
Я пытаюсь создать jar с допустимым путем к классу в его MANIFEST.MF в Eclipse-IDE (версия Kepler Service Release 2; Maven 3.0.4) . Соответствующая конфигурация для плагина maven-jar в моем pom.xml является
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>$${artifact.artifactId}-$${artifact.version}.$${artifact.extension}</customClasspathLayout>
</manifest>
</archive>
</configuration>
</plugin>
Однако это работает не так, как ожидалось. Например, я использую findbugs-maven-plugin, и этот плагин создает некоторые Maven-зависимости, а именно findbugs-maven-plugin-2.5.4.jar в моем локальном репозитории. Вот конфигурация для плагина findbugs
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.4</version>
<configuration>
<findbugsXmlOutput>true</findbugsXmlOutput>
<xmlOutput>true</xmlOutput>
<!-- Optional directory to put findbugs xdoc xml report -->
<xmlOutputDirectory>target/findbugs</xmlOutputDirectory>
</configuration>
</plugin>
Это нормально, но эта зависимость также присутствует в записи classpath моего МАНИФЕСТА.MF, который выглядит следующим образом (отрывок):
lib/findbugs-maven-plugin-2.5.4.jar
Проблема в том, что я понятия не имею, как отключить это поведение.
Что я пробовал до сих пор: используйте maven-dependency-plugin и определите записи excludeGroupId и excludeArtifactId, что решило другую проблему, когда все зависимости были скопированы в lib-Папку в target-Directory.
Очевидно, что я здесь чего-то не хватает.
Комментарии:
1. Записи AFAIK classpath в МАНИФЕСТЕ должны иметь отношение только к зависимостям вашего проекта во время выполнения. Если вы не поместили findbugs где-либо в качестве зависимости вашего проекта, его не должно быть в вашем МАНИФЕСТЕ JAR. Возможно, проверьте с помощью mvn dependency:tree, чтобы увидеть, откуда берется эта зависимость.
2. Отличный совет, который показал мне, что зависимость действительно исходит из другого jar. Есть ли способ избавиться от транзитивной зависимости в моем MANIFEST.MF без изменения pom, из которого он получен?
3. Есть два способа: Во-первых, при объявлении dep, который выдает вам нежелательный JAR, вы можете исключить этот JAR, смотрите Здесь: maven.apache.org/guides/introduction/… «Как использовать исключения зависимостей». Или вы также можете повторно объявить и установить предоставленную область для этого нежелательного JAR. В обоих случаях это приведет к удалению if из упаковки и присутствия в МАНИФЕСТЕ. Но если это понадобится другому JAR во время выполнения, вы получите некоторые ClassNotFoundExceptions
4. Похоже, у нас обоих есть ответ на этот вопрос :). Мой описывает ваш первый подход. Возможно, вы опубликуете свой второй подход в качестве ответа, чтобы я мог его принять?
5. Ну, не уверен, что на сам вопрос дан ответ, поскольку основная проблема возникает из-за чего-то другого, что архиватор устанавливает ваши плагины внутри пути к классу MANIFEST . И, в конце концов, библиотека, которая напрямую зависит от плагина, более чем подозрительна, особенно если вам потребуется удалить ее позже…
Ответ №1:
Хорошо, мне удалось решить эту проблему.
Зависимость возникла из базы модулей, над которой я работал и которая. Он определил зависимость от findbugs-maven-plugin-2.5.4.jar . Эта зависимость была распознана maven и помещена в classpath моего jar, который я хотел создать.
Решение этой проблемы можно найти здесь http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html . Можно определить исключения для транзитивных библиотек. Следовательно, зависимость от базы в моем модуле должна быть записана как:
<dependency>
<groupId>base</groupId>
<artifactId>base</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
</exclusion>
</exclusions>
</dependency>
Спасибо Тому, кто наконец указал мне правильное направление!