执行jar commans行时没有发现Class Def错误

时间:2016-11-23 21:59:46

标签: java maven dependencies classpath

我试图执行一个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>

1 个答案:

答案 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