2013-11-15 32 views
0

因为我的Maven应用程序有一些奇怪的问题,所以我决定创建一个用Maven管理的最简单的Spring独立Java应用程序,以查明我的问题在哪里。我附上我的所有代码,代码是最简单的,但有些错误。我必须失明,但你看到什么可能导致这个异常?简单的Spring和Maven应用程序 - java.lang.NoClassDefFoundError异常

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531) 
    at java.lang.Class.getMethod0(Class.java:2774) 
    at java.lang.Class.getMethod(Class.java:1663) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext 
    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) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 6 more 

我的系统设置:

macbook:Notification jirka$ env 
TERM_PROGRAM=Apple_Terminal 
SHELL=/bin/bash 
TERM=xterm-256color 
TMPDIR=/var/folders/tx/c11w5sf11zj6qbfh5skp8kx00000gn/T/ 
Apple_PubSub_Socket_Render=/tmp/launch-jFadXh/Render 
TERM_PROGRAM_VERSION=326 
TERM_SESSION_ID=827724B1-6606-411F-B9A4-8649BF09D455 
USER=jirka 
SSH_AUTH_SOCK=/tmp/launch-0SCequ/Listeners 
__CF_USER_TEXT_ENCODING=0x1F5:29:56 
PATH=/Users/jirka/java/apache-maven-3.1.1/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin 
__CHECKFIX1436934=1 
PWD=/Users/jirka/Documents/workspace/sandbox/Notification 
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home 
LANG=cs_CZ.UTF-8 
M2_HOME=/Users/jirka/java/apache-maven-3.1.1 
SHLVL=1 
HOME=/Users/jirka 
LOGNAME=jirka 
_=/usr/bin/env 
OLDPWD=/Users/jirka/Documents/workspace/sandbox 

什么没有设置为CLASS_PATH,但是这是我的应用程序的根目录.classpath文件的内容 - 我不知道,如果缺少CLASS_PATH不是问题。如果是这样,那么CLASS_PATH应该指向OS X和Maven 3?

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/> 
    <classpathentry kind="src" path="src/main/java" including="**/*.java"/> 
    <classpathentry kind="output" path="target/classes"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/> 
</classpath> 

我创建Maven项目:

mvn archetype:generate -DgroupId=com.example -DartifactId=Sandbox -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

我设置的依赖关系到

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
     <modelVersion>4.0.0</modelVersion> 
     <groupId>com.example</groupId> 
     <artifactId>Sandbox</artifactId> 
     <packaging>jar</packaging> 
     <version>1.0-SNAPSHOT</version> 
     <name>Notification</name> 
     <url>http://maven.apache.org</url> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
       <version>3.2.5.RELEASE</version> 
      </dependency> 
      <dependency> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
       <version>3.8.1</version> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </project> 

然后,我创建了简单的Spring应用pom.xml配置文件...

内容applicationContext.xml文件:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="helloBean" class="com.example.HelloWorld"> 
     <property name="name" value="Jirka" /> 
    </bean> 

</beans> 

HelloWorld.java

public class HelloWorld { 
    private String name; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void printHello() { 
     System.out.println("Hello ! " + name); 
    } 
} 

和App.java:

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class App { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext(
       "applicationContext.xml"); 
     HelloWorld obj = (HelloWorld) context.getBean("helloBean"); 
     obj.printHello(); 
    } 
} 

然后我打包应用程序到jar文件:

mvn package 

和tryied到运行它:

java -cp target/Notification-1.0-SNAPSHOT.jar com.example.App 

但这种错误发生:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531) 
    at java.lang.Class.getMethod0(Class.java:2774) 
    at java.lang.Class.getMethod(Class.java:1663) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext 
    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) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 6 more 
+0

请阅读此[帖子](http:// stackoverflow。com/questions/574594/how-can-i-create-an-executable-jar -with-dependencies-using-maven)也许它会帮助你。 – kreats

回答

1

Maven的设置可以让您编译代码和生成的jar,但春天是不是在运行时类路径。在命令行添加弹簧到-cp

或者使用Maven程序集插件来构建一个包含代码和所有依赖项的“超级”jar,并运行它。

+0

感谢您的建议,但我在pom.xml中的依赖项中提到了Spring jar。我必须再次将jar添加到'-cp'参数中来下载Spring jar吗? – user2148736

+0

您只需要区分编译类路径和运行时类路径。你在Maven中做的是编译和构建足够的编译类路径。您正在使用* runtime * classpath不足的命令行运行。构建超级瓶子会解决这个问题。如果你正在创建一个war文件,你也可以,因为Spring会自动打包在war文件中,其中'WEB-INF/lib'在运行时类路径中。 – Vidya

0

我有一个小java项目的相同问题,我已经使用Spring和使用Eclipse版本:Mars.1发布(4.5.1)。我所做的只是右键单击project-> export-> runnable jar文件。选择单选按钮将所需的库复制到生成的jar旁边的子文件夹中,然后单击完成。 然后转到命令提示符,选择创建Jar的位置并输入以下命令 命令java -jar jarname 这应该起作用。

相关问题