Зависимости плагинов Maven, включенные в MANIFEST.MF

#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>
  

Спасибо Тому, кто наконец указал мне правильное направление!