SPRING java.lang.NoClassDefFoundError:org / springframework / context / ApplicationContext

时间:2013-10-02 01:02:53

标签: java spring maven dependencies noclassdeffounderror

似乎人们有类似的问题,但在IDE上。 我没有使用IDE。

我使用Maven依赖项安装了Spring,您将在我的build.xml文件中看到。

我收到以下未找到org.springframework.context的stacktrace:

  

运行解耦:

     
[java] java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
 [java]     at java.lang.Class.getDeclaredMethods0(Native Method)
[java]     at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
 [java]     at java.lang.Class.getMethod0(Class.java:2685)
 [java]     at java.lang.Class.getMethod(Class.java:1620)
 [java]     at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:488)
 [java]     at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
 [java] Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
 [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
  
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
 [java]     ... 6 more
 [java] Exception in thread "main"
 [java] Java Result: 1
  

建立成功   总时间:4秒

这是我的客户端(java文件:DecoupledDataReaderClient.java):

package com.example.decouple.client;

import java.io.*;
import java.util.*;
import com.example.filereader.IReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DecoupledDataReaderClient {
  private IReader reader = null;
  private ApplicationContext ctx = null;
  public DecoupledDataReaderClient() {
    ctx = new ClassPathXmlApplicationContext("beans.xml");
  }
  private String fetchData() {
    reader = (IReader) ctx.getBean("reader");
    return reader.read();
  }
  public static void main(String[] args) {
    DecoupledDataReaderClient client = new DecoupledDataReaderClient();
    System.out.println("Example 1.3: Got data: " + client.fetchData());
  }
}

这是我的build.xml文件,其中包含spring依赖关系& classpath和xmlns使用MAVEN * 编辑:将CLASSPATH添加到RUN-DECOUPLE *

<project name="data-reader" default="compile" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
    <property name="src" location="."/>
    <property name="obj" location="../classes"/>
    <property name="jarfile" location="../data-reader.
        jar"/>

    <target name="init">
        <mkdir dir="dist" />
        <artifact:dependencies pathId="dependency.classpath">
            <dependency groupId="org.springframework"
                        artifactId="spring-context"
                        version="3.2.4.RELEASE" />
        </artifact:dependencies>
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${obj}"/>
        <depend srcdir="${src}" destdir="${obj}" />
        <javac includeantruntime="false" 
               srcdir="${src}" 
               destdir="${obj}">
            <classpath refid="dependency.classpath" />
        </javac>
    </target>

    <target name="jar" depends="compile">
        <jar basedir="${obj}" destfile="${jarfile}">
            <include name="*.class"/>
        </jar>
    </target>

    <target name="run" depends="compile">
        <java classpath="${obj}" classname="VanillaDataReaderClient"/>
    </target>

    <target name="decouple-jar" depends="compile">
        <jar destfile="dist/decouple.jar" basedir="${obj}">
            <manifest>
                <attribute name="Main-Class" value="com.example.decouple.client.DecoupledDataReaderClient"/>
            </manifest>
        </jar>  
    </target>

    <target name="run-decouple" depends="decouple-jar">
    <java fork="true" jar="dist/decouple.jar" >
        <classpath>
            <path refid="dependency.classpath" />
        </classpath>
    </java>
</target>


</project>

最后,这是我的beans.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

    <bean name="reader" class="com.example.filereader.VanillaFileReader">
        <constructor-arg value="src/hello.txt" />
    </bean>
</beans>

如果有人可以帮我解决为什么它没有找到类,即使spring依赖项在我的build.xml中(根据build.xml的输出成功下载)并且在类路径中,我会大大欣赏它。

提前致谢。

1 个答案:

答案 0 :(得分:2)

artifact:dependencies在路径dependency.classpath中存储Spring依赖项的类路径,并在编译时使用它:

<javac ...
    ...
    <classpath refid="dependency.classpath" />

但是,当你运行时,你只是在类路径中包含你编译的源:

<target name="run" depends="compile">
    <java classpath="${obj}" classname="VanillaDataReaderClient"/>
</target>

这意味着不包括Spring类。

尝试同时包含dependency.classpath

<target name="run" depends="compile">
    <java classname="VanillaDataReaderClient">
        <classpath>
            <pathelement location="${obj}"/>
            <path refid="dependency.classpath"/>
        </classpath>
    </java>
</target>

编辑: 您的run-decouple目标正在使用jar:“When using the jar attribute, all classpath settings are ignored”。切换到指定主类和类路径,因此您可以包含依赖项:

<target name="run-decouple" depends="decouple-jar">
    <java fork="true" classname="com.example.decouple.client.DecoupledDataReaderClient">
        <classpath>
            <pathelement location="dist/decouple.jar" />
            <path refid="dependency.classpath" />
        </classpath>
    </java>
</target>