我试图执行一个JAR,它在JAR lib文件夹下复制了所有依赖项。但是当我尝试执行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 :(得分:0)
java无法在jar中加载嵌入式jar。你需要一个超级jar类加载器。
类路径的清单条目将查找jar外的类路径lib
,而不是内部。
通常的策略是将所有依赖jar扩展为一个新jar,以便所有类都在同一个jar文件中。这有缺点,因为META-INF信息被覆盖。
另一个常见的甚至是工作策略是已经提到的替代类加载器。有一些可用于maven。
我用过一个罐子,效果很好。如果你使用spring-boot,那么spring-boot类加载器也会为你做同样的事情。
现在似乎放弃了一个罐子,你可以在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/
Spring Boot使用spring-boot-loader:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html
maven的apache shade插件似乎很受欢迎,但到目前为止我还没有使用过。 https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html