我正在使用 maven 进行独立应用程序构建,并将依赖项添加到目标jar 在 lib文件夹中使用 maven-dependency-plugin 与 maven-assembly-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>
答案 0 :(得分:2)
你那里有一堆乱七八糟的POM,你正在建造两个罐子。
其中一个jar是通过首先将依赖项复制到target/classes/lib
- 一个可疑的实践开始 - 并让jar插件的默认执行构建其普通jar来构建的。这个jar包含了所有代码,就像普通的jar一样,但在/lib
内包含了所有的依赖jar。它还有一个清单,用于指定Main-Class
和Class-Path
列出相对路径lib/...jar
所需的所有广告。听起来这是你想要跑的那个。它无法找到所需类的原因是独立Java应用程序的类路径是文件系统上包含类文件的文件夹或jar文件的列表。换句话说,不会在另一个jar文件中找到jar文件,这就是你所拥有的。为了实现您的预期,您需要在jar文件旁边有一个lib
目录,该目录中包含所有依赖项。这就是造成你现在问题的原因。
另一个jar由程序集插件构建。由于你之前使用依赖插件的滑稽动作,这个也应该在/lib
中包含所有依赖关系jar,我已经解释过它不会完成任何事情,但是因为jar-with-dependencies
描述符工作,它也将提取所有这些jar并将所有类与您自己的类一起放入jar中。如果你要运行这个jar,你可能会超越ClassNotFoundException,但是像这样的“胖罐子”存在众所周知的问题,这意味着你不应该这样做,除非你有一些非常有说服力的理由。以下问题描述了一个这样的问题:
Maven and Spring = Unable to create application context: Unable to locate Spring NamespaceHandler
答案 1 :(得分:0)
该类位于spring-context.jar中。在pom.xml中添加该依赖项。