似乎人们有类似的问题,但在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的输出成功下载)并且在类路径中,我会大大欣赏它。
提前致谢。
答案 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>