Java 运行Jar文件时包含外部Jar

Java 运行Jar文件时包含外部Jar,java,ant,jar,manifest,Java,Ant,Jar,Manifest,我正在编写一个ant文件,它将编译并运行我的java文件。ant创建AntLabRun.jar文件。当我尝试运行jar文件时,线程“main”java.lang.NoClassDefFoundError中出现异常 下面是目录的大致外观 -lib/resources.jar <target name="init"> <property name="src" location="src"/> <property name="build"

我正在编写一个ant文件,它将编译并运行我的java文件。ant创建AntLabRun.jar文件。当我尝试运行jar文件时,线程“main”java.lang.NoClassDefFoundError中出现异常

下面是目录的大致外观

-lib/resources.jar

<target name="init">
        <property name="src" location="src"/>
        <property name="build" location="build"/>
        <property name="apidoc" location="apidoc"/>
        <property name="lib" location="lib"/>
        <path id="path.base">
         <pathelement path="${build}" />
         <fileset dir="lib">
            <include name="*.jar" />
         </fileset>
      </path>          
   <manifestclasspath property="manifest.classpath" jarfile="resources.jar">
   <classpath location="${lib}"/>
   </manifestclasspath>
        </target>
<!-- I excluded the unnecessary targets -->

target name="jar" depends="compile">
        <jar destfile="AntLabRun.jar" basedir="${build}">
   <include name="edu/**/*.class"/>
   <manifest>
        <attribute name="Main-Class" value="edu.gatech.oad.antlab.pkg1.AntLabMain"/>
        <attribute name="Class-Path" value="${manifest.classpath}"/>
   </manifest>
              </jar>
    </target>
    <target name="run" depends="jar">
        <java jar="AntLabRun.jar" fork="true">
        </java>
    </target>
-src/**/pkg1/AntLabMain.java

AntLabMain导入resources.jar中的包

<target name="init">
        <property name="src" location="src"/>
        <property name="build" location="build"/>
        <property name="apidoc" location="apidoc"/>
        <property name="lib" location="lib"/>
        <path id="path.base">
         <pathelement path="${build}" />
         <fileset dir="lib">
            <include name="*.jar" />
         </fileset>
      </path>          
   <manifestclasspath property="manifest.classpath" jarfile="resources.jar">
   <classpath location="${lib}"/>
   </manifestclasspath>
        </target>
<!-- I excluded the unnecessary targets -->

target name="jar" depends="compile">
        <jar destfile="AntLabRun.jar" basedir="${build}">
   <include name="edu/**/*.class"/>
   <manifest>
        <attribute name="Main-Class" value="edu.gatech.oad.antlab.pkg1.AntLabMain"/>
        <attribute name="Class-Path" value="${manifest.classpath}"/>
   </manifest>
              </jar>
    </target>
    <target name="run" depends="jar">
        <java jar="AntLabRun.jar" fork="true">
        </java>
    </target>

target name=“jar”dependens=“compile”>

我已经浏览了所有与此相关的问题,但尚未提交解决方案。

您可以使用
pathelement
元素。例如:

    <!-- Define the CLASSPATH -->
<path id="compile.classpath">
    <pathelement location="lib/resources.jar" />
</path>
<javac srcdir="${src.home}" destdir="${work.home}/bin" debug="on">
    <classpath refid="compile.classpath" />
</javac>
最好将以上每一项都放在各自的
目标下(对我来说)

您还可以在
path
元素下使用多个
pathelement
元素进行多个jar引用

如果希望jar文件引用另一个jar文件,可以将引用放在MANIFEST.MF中,下面是使用ant创建清单的示例

<target name="create_manifest">
        <manifest file="${work.home}/META-INF/MANIFEST.MF">
            <attribute name="Manifest-Version" value="1.0" />
            <attribute name="Version" value="${app.version}" />
            <attribute name="Company" value="Comp Name here" />
            <attribute name="Project" value="${app.name}" />
            <attribute name="Java-Version" value="${java.version}" />

<!--Here is the reference to jar files this jar manifest will reference.-->
            <attribute name="Class-Path" value="one.jar two.jar three.jar etc.jar" />
        </manifest>
    </target>
您将注意到,
dependens
标记将
create_manifest
copy_all_class_files
作为依赖项

如您所知,依赖项目标将首先为
目标运行,这样您就可以确保您的订单是正确的

我认为部分问题在于ant文件的复杂性

试着将你的每项任务分解成不同的目标,并在继续下一个任务之前解决每个目标的问题


通过这种方式,您可以确保以前的任何东西都能按预期工作,并且不必担心以前的任务不能按预期工作。

在我的编译目标中,我已经在使用pathelement执行您建议的操作。我正在引用清单中的另一个jar。也许,问题在于我正在制作的jar的主目录是build,而我正在引用的jar的目录是lib,它在build之外?修改了答案。您还将注意到,我在创建jar文件时创建了临时目录。完成后,我会处理这些目录。这使我能够更轻松地调试,并拥有更灵活的jar/ant文件,而不仅仅限于我正在使用的IDE。