我在“src”文件夹中有一堆.java文件,这些文件依赖于“lib”文件夹中的三个jar。我有以下build.xml文件:
<?xml version="1.0"?>
<project name="MyProj" basedir=".">
<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="lib" value="lib"/>
<path id="master-classpath">
<fileset dir="${lib}">
<include name="activemq-all-5.1-SNAPSHOT.jar"/>
<include name="geronimo-jms_1.1_spec-1.1.1.jar"/>
<include name="activemq-core-5.3.0.jar"/>
</fileset>
</path>
<javac destdir="${build}">
<src path="${src}"/>
<classpath refid="master-classpath"/>
</javac>
</project>
这编译很好,但是当我尝试并运行时,我得到了
“java.lang.NoClassDefFoundError: 的javax / JMS /目的地“
当我使用Eclipse在jar路径中包含jar时,这个程序运行并编译得很好。
编辑:所以我将jar复制到具有编译类的文件夹中。主方法的类是NDriver.class。当我尝试:java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar NDriver
这给出了:
线程“main”中的异常 java.lang.NoClassDefFoundError: NDriver
我很感激任何帮助。
答案 0 :(得分:3)
当运行应用程序时,您需要将编译时使用的jar放在类路径上。遗憾的是,您没有提供有关如何实际运行它的任何细节,因此很难提供更多指导。
UPDATE:包含已编译类的目录也需要添加到类路径中。如果从包含已编译类的目录启动java
,则可以使用.
指定当前目录。将其添加到类路径中,如下所示,告诉java
也在那里查找类(我在.
之后添加了activemq-all-5.1-SNAPSHOT.jar
):
java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar:. NDriver
答案 1 :(得分:2)
一种方式(与你的变量略有不同)
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<manifestclasspath property="manifest.classpath" jarfile="${jarfile}">
<classpath refid="classpath"/>
</manifestclasspath>
<target name="jar" depends="compile" description="create the jar">
<jar destfile="${jarfile}" basedir="${build.dir}">
<manifest>
<attribute name="Manifest-Version" value="${manifest-version}"/>
<attribute name="Created-By" value="${ant.java.version}"/>
<attribute name="Main-Class" value="${main-class}"/>
<attribute name="Class-Path" value="${manifest.classpath}"/>
</manifest>
</jar>
</target>
当然,我假设您正在创建一个jar并运行它(包括那里的类路径)。另一种选择是使用run
目标使用<java>
标记并在那里明确使用类路径。
答案 2 :(得分:1)
运行程序时,库jar是否包含在类路径中? Eclipse会自动添加这些,但您需要在从命令行运行程序时指定它们。
答案 3 :(得分:0)
根据我的经验,Eclipse似乎经常在类路径中包含类和jar,而不显式使用类路径声明。实际上,有时很难从Eclipse的构建中删除类(它们必须被删除或清理)。