运行jar文件时包含外部Jar

时间:2011-06-19 18:47:00

标签: java ant jar manifest

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

这是目录的粗略外观

-lib / resources.jar

-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>

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

1 个答案:

答案 0 :(得分:2)

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

    <!-- Define the CLASSPATH -->
<path id="compile.classpath">
    <pathelement location="lib/resources.jar" />
</path>

然后在使用id元素时引用javac。例如:

<javac srcdir="${src.home}" destdir="${work.home}/bin" debug="on">
    <classpath refid="compile.classpath" />
</javac>

最好将上述每一项都置于他们自己的targets之下,(无论如何)。

您还可以在pathelement元素下使用多个path元素,用于多个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>

要遵循的是示例target,以便在创建jar时复制并包含类文件并指向正确的清单。

<target name="create_jar" depends="create_manifest, copy_all_class_files">
    <jar destfile="${guiJar}" manifest="jar_temp/META-INF/MANIFEST.MF" basedir="jar_temp">
    </jar>
</target>

<target name="copy_all_class_files">
    <copy todir="jar_temp">
        <fileset dir="classes">
            <include name="*/**" />
        </fileset>
    </copy>
</target>

您会注意到depends代码将create_manifestcopy_all_class_files视为依赖关系。

如您所知,依赖关系目标将首先针对target运行,这样您就可以确保订单正确无误。

我认为您的部分问题是您的蚂蚁文件复杂性。

尝试将每个任务分解为单独的目标并解决每个目标的问题,然后再转到下一个目标。

这样你可以确保你拥有的任何先前的东西都按预期工作,而不必担心以前的任务没有按预期工作。