2016-11-23 95 views
0

我试图执行一个JAR,它具有在JAR lib文件夹下复制的所有依赖关系。但是当我尝试执行JAR命令行我得到以下错误执行jar命令行时没有发现类错误

at com.abc<clinit>(abc.java:33)Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 

这里是我的JAR结构:

abc.jar ---的lib \所有依赖库 --- COM \ ABC --- META-INF

,这里是我的pom.xml

<artifactId>maven-jar-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <useUniqueVersions>false</useUniqueVersions> 
       <mainClass>com.main.class</mainClass> 
       <classpathPrefix>./lib/</classpathPrefix> 
      </manifest> 
      </archive> 
     </configuration> 
     </plugin> 
      <plugin> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>copy-dependencies</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.build.directory}/classes/lib</outputDirectory> 
       </configuration> 
       </execution> 
      </executions> 
      </plugin> 
     </plugins> 
    </build> 

回答

0

的java在一个罐子里不能加载嵌入的罐子。你需要一个超级jar的类加载器。

类路径的清单条目将在jar外部寻找类路径lib,而不是在里面。

通常的策略是将所有的依赖jar扩展成一个新的jar,这样所有的类都在同一个jar文件中。这有缺点,因为META-INF信息被覆盖。

其他常见甚至是工作策略是已经提到的替代类加载器。有一些可用于maven。

我已经使用了单罐,它工作得很好。如果你使用弹簧引导,那么弹簧引导类加载器会为你做同样的事情。

一罐子似乎是时下抛弃,你可以在这里找到https://mvnrepository.com/artifact/com.jolira/onejar-maven-plugin/1.4.4,而这些人有某种教程https://www.mkyong.com/maven/maven-create-a-fat-jar-file-one-jar-example/

春天开机使用弹簧引导装载程序:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html

的阿帕奇遮阳插件因为maven似乎很受欢迎,但我迄今还没有使用过。 https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html