我正在使用maven构建独立应用程序,并将依赖项添加到目标jar> 在 lib 文件夹 中使用 maven-dependency-plugin 和 maven-assemble-plugin 应用程序从 Eclipse 运行良好,没有任何问题,但是当尝试从命令行运行生成的 jar 文件,我收到以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/support/ClassPathXmlApplicationContext
at com.spring.sample.MainClass.main(MainClass.java:11)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.support.ClassPathXmlApplicationContext
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
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)
... 1 more
我查看了生成的 jar lib 文件夹,发现 spring-context-support.jar 已经存在,所以我想知道为什么会出现这样的异常。
这是我的maven 构建配置:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-my-bundle</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
最佳答案
你的 POM 有点乱,而且你正在构建两个 jar。
其中一个 jar 的构建方法是首先将依赖项复制到 target/classes/lib 中(一开始这是一种有问题的做法),然后让 jar 插件的默认执行构建其正常的 jar 。这个 jar 像普通 jar 一样包含您的所有代码,但也将所有依赖项 jar 放在 /lib
中。它还具有一个 list ,指定一个 Main-Class
和一个 Class-Path
,列出相对路径 lib/...jar< 的所有必需 jar/
。听起来这就是你想要运行的。它找不到所需的类的原因是,独立 Java 应用程序的类路径是文件系统上包含类文件的文件夹或 jar 文件的列表。换句话说,它不会在另一个 jar 文件中找到 jar 文件,这就是您所拥有的。为了使其按照您期望的方式工作,您需要在 jar 文件旁边有一个 lib
目录,其中包含所有依赖项。这就是导致您当前问题的原因。
另一个 jar 是由程序集插件构建的。由于您之前对依赖项插件的滑稽 Action ,这个插件也应该在 /lib
中包含所有依赖项 jar,我已经解释过它不会完成任何事情,但由于 jar-with-dependencies
描述符有效,它还会提取所有这些 jar 并将它们的所有类与您自己的类一起放入您的 jar 中。如果你要运行这个 jar,你可能会遇到 ClassNotFoundException,但是像这样的“胖 jar”存在众所周知的问题,这意味着你不应该这样做,除非你有一些真正令人信服的理由。以下问题描述了一个这样的问题:
Maven and Spring = Unable to create application context: Unable to locate Spring NamespaceHandler
关于java - ClassNotFoundException : org. springframework.context.support.ClassPathXmlApplicationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8621608/