【发布时间】:2016-03-24 09:08:53
【问题描述】:
这是我第一次在这里写作,所以我希望我能把一切都做好。
我有一个 Java 应用程序,我们称它为 A。此应用程序依赖于另一个项目 B(构建路径上的必需项目)。项目结构如下:
CommonFolder/项目 B
-- src
-- lib
build.xml
CommonFolder/子文件夹/Project A
-- src
-- lib
-- config
build.xml
项目 B 中的 build.xml 运行良好,并在 dist 文件夹中创建一个 jar 文件。现在在项目 A 中,build.xml 文件应该首先从项目 B 调用 build.xml,然后它应该创建 jar 文件。不知何故,这不起作用。如果我只是将项目 B 中的 jar 文件复制到项目 A 的 lib 文件夹中,它可以工作,但我不想手动执行此操作。
我的第二个问题是项目A的最终jar文件会很大,因为lib文件夹中有很多库。我想将 jar 文件拆分为两个文件:libraries.jar(也包含来自项目 B 的依赖项)和 application.jar。当 application.jar 启动时,它应该使用 library.jar(两个 jar 在同一个文件夹中)。好处是我只需要上传小得多的 application.jar(如果我不更改库的话)。
如何做到这一点?
期待答案。
这两个都是 build.xml 文件。
项目B
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="complete build" name="Create runnable jar file">
<property name="src.dir" location="src" />
<property name="lib.dir" location="lib" />
<property name="build.dir" location="bin" />
<property name="dist.dir" location="dist" />
<property name="build.sysclasspath" value="last" />
<path id="project-classpath">
<fileset dir="${lib.dir}" includes="*.jar" />
</path>
<target name="remove release">
<delete dir="${dist.dir}" />
</target>
<target name="clean build">
<delete dir="${build.dir}" />
</target>
<target name="compile" depends="clean build">
<mkdir dir="${build.dir}" />
<javac srcdir="${src.dir}" destdir="${build.dir}" debug="on" target="1.8" source="1.8">
<classpath refid="project-classpath" />
<compilerarg value="-Xlint:none" />
</javac>
</target>
<target name="build jar" depends="remove release, compile">
<mkdir dir="${dist.dir}" />
<jar destfile="${dist.dir}/projectA.jar">
<fileset dir="${build.dir}" />
<zipgroupfileset dir="lib" excludes="META-INF/**" includes="*.jar"/>
</jar>
<antcall target="clean build" />
</target>
<target name="complete build" depends="build jar, clean build" />
</project>
项目 A
<path id="project-classpath">
<fileset dir="${lib.dir}" includes="*.jar" />
</path>
<target name="remove release">
<delete dir="${dist.dir}" />
</target>
<target name="clean build">
<delete dir="${build.dir}" />
</target>
<target name="clean docs">
<delete dir="${docs.dir}" />
</target>
<target name="build-deps">
<ant antfile="../../ProjectB/build.xml" target="complete build"/>
</target>
<target name="compile" depends="clean build, build-deps">
<mkdir dir="${build.dir}" />
<javac srcdir="${src.dir}" destdir="${build.dir}" debug="on" target="1.8" source="1.8">
<classpath refid="project-classpath" />
<compilerarg value="-Xlint:none" />
</javac>
</target>
<target name="docs" depends="clean docs, compile">
<mkdir dir="${docs.dir}" />
<javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">
<fileset dir="${src.dir}">
<include name="**" />
</fileset>
</javadoc>
</target>
<target name="build jar" depends="remove release, compile">
<mkdir dir="${dist.dir}" />
<jar destfile="${dist.dir}/ProjectA.jar">
<manifest>
<attribute name="Main-Class" value="something.main.Main" />
<attribute name="Class-Path" value="." />
</manifest>
<fileset dir="${build.dir}" />
<zipfileset dir="config" />
<zipgroupfileset dir="lib" excludes="META-INF/**" includes="*.jar"/>
</jar>
<antcall target="clean build" />
</target>
<target name="complete build" depends="docs, build jar, clean build" />
【问题讨论】: