如何在包含多个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 
+1

如果您使用的是Java 6,并且罐子都在同一个目录中,那么您也可以使用通配符。例如:java -cp ./* :. 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会自动添加这些,但是当您从命令行运行程序时需要指定它们。