【问题标题】:How can include multiple jars in the classpath using ant?如何使用 ant 在类路径中包含多个 jar?
【发布时间】:2009-12-22 22:54:57
【问题描述】:

我在“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 复制到包含已编译类的文件夹中。具有 main 方法的类是 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

我将不胜感激。

【问题讨论】:

    标签: java ant jar build-tools


    【解决方案1】:

    运行应用程序时,您需要将编译时使用的 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
    

    【讨论】:

    • 如果您使用的是 Java 6 并且 jars 都在同一个目录中,您也可以使用通配符。类似于:java -cp ./*:. NDriver
    【解决方案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 目标,它使用&lt;java&gt; 标记并在那里显式使用类路径。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-16
          • 2011-07-16
          • 1970-01-01
          • 1970-01-01
          • 2012-02-15
          • 2023-03-18
          • 1970-01-01
          相关资源
          最近更新 更多