2015-11-08 3 views
0

Я создаю исполняемый uber jar с плагином maven shade, он имеет зависимость от некоторых классов в локальном системном банке (mobile-dock-support.jar), который я хочу включить в него во время фазовое пакет, так что я плагин тени сконфигурирован как такMaven shade исполняемый uber jar NoClassDefFoundError

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.2</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>uk.xxx.mobiledock.PCSyncApplication</mainClass> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>uk.xxx</groupId> 
      <artifactId>mobile-dock-support</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${project.build.directory}/../src/main/libs/mobile-dock-support.jar</systemPath> 
     </dependency> 
    </dependencies> 
</plugin> 

кажется упаковать банку штраф, но когда я запускаю банку, используя java -jar xxx.jar это дает мне следующую

java.lang.NoClassDefFoundError: uk/xxx/mobiledock/MobileDockException 
     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: uk.xxx.mobiledock.MobileDockException 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 7 more 
Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" 

Я также настройте плагин exec maven и запустите mvn exec:java -Dexec.mainClass=uk.xxx.mobiledock.PCSyncApplication r без программы, как ожидалось.

Вот как Exec Maven плагин установки

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.4.0</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <includePluginDependencies>true</includePluginDependencies> 
     <mainClass>uk.xxx.mobiledock.PCSyncApplication</mainClass> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>uk.xxx</groupId> 
      <artifactId>mobile-dock-support</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${project.build.directory}/../src/main/libs/mobile-dock-support.jar</systemPath> 
     </dependency> 
    </dependencies> 
</plugin> 
+0

Зависимости в системной области должны быть исключены из-за проблем с причинами, которые вы видите ... Развернитесь в диспетчере хранилища, и все. – khmarbaise

ответ

0

OK тогда появляется вопрос оттенок плагин не копирует зависимости системных убер банку. Есть несколько «правильных» способов фиксации этого

  1. Установите зависимость в локальный репозиторий Maven с использованием mvn install

  2. Используйте менеджер хранилища, такие как Nexus

Если же вы похожи на меня, и у меня не было выбора этих двух, поскольку это совместный проект, и не было никакого варианта для чего-то вроде Nexus, тогда вот что я сделал, чтобы заставить его работать

Используйте плагин зависимостей maven для копирования любых зависимостей системы где-то относительно упакованной банки, например.

<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
       <includeArtifactIds>mobile-dock-support</includeArtifactIds> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Добавить скопированные банки как часть пути класса в файле манифеста uber, например.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.2</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <manifestEntries> 
          <Main-Class>uk.xxx.mobiledock.PCSyncApplication</Main-Class> 
          <Class-Path>lib/mobile-dock-support-${mobile-dock-support.version}.jar</Class-Path> 
         </manifestEntries> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
Смежные вопросы