使用 ANT 构建时,您需要的外部 jars 会被 ANT 工具添加到类路径中。查看您的构建脚本,您很可能在 javac 任务或定义类路径的设置任务中有一个条目。
构建代码后,您的 jar 文件中只包含您的类,默认情况下不会将第 3 方 jar 文件(如 Apache)中的类添加到您的 jar 文件中。
您需要决定是想要一个包含所有需要的类的 jar 文件,还是愿意部署多个 jar 文件?如果您愿意将应用程序作为多个 jar 文件交付,您将需要提供一个批处理文件或 shell 脚本来为构建类路径以包含已部署 jars 的用户启动应用程序。
如果您想要一个 jar 文件,您可以执行以下操作。假设您拥有的所有 3rd 方 jar 都位于由 ANT 属性 lib.dir 标识的目录中:
<jar destfile='${build.dir}/lib-jars.jar'>
<zipgroupfileset dir="${lib.dir}">
<include name="**/*.jar" />
</zipgroupfileset>
</jar>
<sleep seconds='1'/> <!-- avoid timestamp warnings -->
这将在您的 build.dir 目录中创建一个名为 lib-jars.jar 的单个 jar 文件,其中包含来自所有第 3 方的所有类罐子。请理解,如果等效文件(如 MANIFEST.MF 文件)存在于多个 jar 中并且仅存在最后一个,则会导致它们被覆盖。
一旦你有了这个新的 all-libs jar,你就可以将你的应用程序类和这个 all-libs jar 的内容打包到一个 jar 中:
<jar destfile='${jar.file}' basedir='${classes.dir}'>
<!-- using zipfileset we can filter on entries in the one file -->
<zipfileset src='${build.dir}/lib-jars.jar'>
<exclude name="META-INF/MANIFEST.MF"/>
</zipfileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="${main.class}"/>
<section name="common">
<attribute name="Specification-Title" value="${project.title}"/>
<attribute name="Specification-Version" value="${release.version}"/>
<attribute name="Specification-Vendor" value="${vendor}"/>
<attribute name="Implementation-Title" value="${project.title}"/>
<attribute name="Implementation-Version" value="${release.version}"/>
<attribute name="Implementation-Vendor" value="${vendor}"/>
</section>
</manifest>
</jar>
请注意,我从 all-libs jar 中排除了 MANIFEST.MF 文件并创建了我自己的文件。然后最终结果是一个 jar 文件,其中包含所有库 jar 文件和您的类中的所有类/属性文件/资源。