如何在包含多个jar的类路径中使用ant?
我在“src”文件夹中有一堆.java文件,这些文件夹依赖于“lib”文件夹中的三个罐子。我有以下build.xml文件:如何在包含多个jar的类路径中使用ant?
<?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/Destination"
该程序运行和编译很好,当我使用包括在BuildPath罐子Eclipse,但是。
编辑:所以我复制到具有编译类的文件夹的罐子。主要方法的类是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
这给:
Exception in thread "main" java.lang.NoClassDefFoundError: NDriver
我会很感激的任何帮助。
您需要将编译时使用的jar放在类路径上,当运行时的应用程序。可悲的是,你没有提供任何关于你如何运行它的细节,所以很难提供更多的指导。
更新:包含已编译类的目录也需要添加到类路径中。如果从包含已编译类的目录启动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
的一种方式(稍有不同的变量比你)
<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>
当然在这里我假设你正在创建一个罐子并运行它(包括类路径那里)。另一种选择是使用<java>
标记的run
目标,并在其中显式使用类路径。
从我的经验看来Eclipse将通常包括在类路径中的类和JAR而不显式使用类路径声明。事实上,从Eclipse的构建中删除类有时很难(它们必须被删除或清除)。
运行程序时库类库是否包含在类路径中? Eclipse会自动添加这些,但是当您从命令行运行程序时需要指定它们。
如果您使用的是Java 6,并且罐子都在同一个目录中,那么您也可以使用通配符。例如:java -cp ./* :. NDriver –