如何在类路径中使用ant包含多个jar?

时间:2009-12-22 22:54:58

标签: java ant jar build-tools

我在“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

我很感激任何帮助。

4 个答案:

答案 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的构建中删除类(它们必须被删除或清理)。