我正在编写一个将编译并运行我的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>
我已查看了所有与此相关的问题,但尚未提交解决方案。
答案 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_manifest
和copy_all_class_files
视为依赖关系。
如您所知,依赖关系目标将首先针对target
运行,这样您就可以确保订单正确无误。
我认为您的部分问题是您的蚂蚁文件复杂性。
尝试将每个任务分解为单独的目标并解决每个目标的问题,然后再转到下一个目标。
这样你可以确保你拥有的任何先前的东西都按预期工作,而不必担心以前的任务没有按预期工作。