gpt4 book ai didi

java - 运行 jar 文件时包含外部 Jar

转载 作者:行者123 更新时间:2023-11-30 05:01:52 25 4
gpt4 key购买 nike

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

这是目录的粗略外观

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

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

最佳答案

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

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

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

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

最好将上述每个目标都放在自己的目标下(无论如何对我来说)。

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

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

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

接下来是示例目标,用于在创建jar时复制并包含类文件并指向正确的 list 。

<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 作为依赖项。

如您所知,依赖项目标将首先针对目标运行,这样您就可以确保顺序正确。

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

尝试将每个任务分解为单独的目标,并在继续下一个目标之前解决每个目标的问题。

这样您就可以确保您之前拥有的任何内容都按预期工作,而不必担心以前的任务无法按预期工作。

关于java - 运行 jar 文件时包含外部 Jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6404416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com