3

I have a bunch of .java files in a "src" folder that depend on three jars in a "lib" folder. I have the following build.xml file:

<?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>

This compiles fine, but when I try and run I get

"java.lang.NoClassDefFoundError: javax/jms/Destination"

This program runs and compiles fine when I include the jars in the buildpath using Eclipse, though.

EDIT: So I copied the jars into the folder that has the compiled classes. The class with the main method is NDriver.class. When I try:

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar NDriver

This gives:

Exception in thread "main" java.lang.NoClassDefFoundError: NDriver

I'd appreciate any help.

4

4 回答 4

3

运行应用程序时,您需要将编译时使用的 jars 放在类路径中。遗憾的是,您没有提供有关实际运行方式的任何详细信息,因此很难提供更多指导。

更新:包含已编译类的目录也需要添加到类路径中。如果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
于 2009-12-22T23:05:44.677 回答
1

一种方式(与您的变量略有不同)

<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>标签的目标并在那里显式使用类路径。

于 2009-12-22T23:03:09.033 回答
1

运行程序时,类路径中是否包含库 jar?Eclipse 会自动添加这些,但您需要在从命令行运行程序时指定它们。

于 2009-12-22T23:08:35.700 回答
0

根据我的经验,Eclipse 似乎通常会在类路径中包含类和 jar,而不显式使用类路径声明。事实上,有时很难从 Eclipse 的构建中删除类(它们必须被删除或清理)。

于 2009-12-22T23:06:33.927 回答