2015-07-27 2 views
1

Я пытаюсь скомпилировать проект с Maven (через Eclipse), удаляя версии из JAR зависимых. У меня есть следующие в моем pom.xml:Maven dependency stripVersion создает неправильный путь к классам

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-dependency-plugin</artifactId> 
<version>2.8</version> 
<executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <overWriteReleases>false</overWriteReleases> 
      <overWriteSnapshots>false</overWriteSnapshots> 
      <overWriteIfNewer>true</overWriteIfNewer> 
      <stripVersion>true</stripVersion> 
     </configuration> 
    </execution> 
</executions> 
</plugin> 

И действительно, баночки копируются в Lib/без номеров версий. Увы, я получаю ClassNotFound, потому что MANIFEST.MF в сгенерированном исполняемом JAR содержит путь к классам, ссылающийся на файлы , включая номера версий, которых, естественно, нет.

Что я делаю неправильно и как его исправить?

Edit: JAR создается с Maven-баночки-плагин:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-jar-plugin</artifactId> 
<version>2.6</version> 
<configuration> 
    <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <classpathPrefix>lib/</classpathPrefix> 
      <mainClass>my.main.class</mainClass> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
     </manifest> 
    </archive> 
</configuration> 
</plugin> 

Я использую Run as -> Maven Install (Eclipse с m2e плагин)

+1

Как вы генерации ехес uable JAR? Обычно для этого не требуется использование плагина зависимостей. – Seelenvirtuose

+0

Использование maven-jar-plugin. Я добавил конфигурацию из моего pom.xml. Вы имеете в виду, что maven-jar-plugin может копировать зависимости самостоятельно? Как я могу сказать это, чтобы стричь номера версий? – Itai

+0

Вы можете использовать [shade-plugin] (https://maven.apache.org/plugins/maven-shade-plugin/) или [сборку-плагин] (https://maven.apache.org/components/ plugins/maven-assembly-plugin /) для этой цели. Оба плагина могут создавать _FAT JAR_ (в которых вам не нужно настраивать имена библиотек). Плагин сборки также может создавать ZIP-файл, например, который имеет структуру, которую вы, возможно, захотите: исполняемый JAR и его библиотеки в каталоге lib. В этом случае вы должны настроить [jar-plugin] (https://maven.apache.org/plugins/maven-jar-plugin/), чтобы ссылаться на правильные библиотеки. – Seelenvirtuose

ответ

2

Измените Maven-банку-плагин для создания макета пользовательского пути к классам без версии

Пример:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>3.0.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <classpathLayoutType>custom</classpathLayoutType> 
         <customClasspathLayout>lib/$${artifact.artifactId}.$${artifact.extension}</customClasspathLayout> 
         <addClasspath>true</addClasspath> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
Смежные вопросы