java - 如何包含依赖项目并将 jar 拆分为两个 jar?

标签 java eclipse ant

这是我第一次在这里写作,所以我希望一切都正确。

我有一个 Java 应用程序,我们将其称为 A。该应用程序依赖于另一个项目 B(构建路径上所需的项目)。项目结构如下:

CommonFolder/项目 B

 -- src

 -- lib

 build.xml

公共(public)文件夹/子文件夹/项目 A

 -- src

 -- lib

 -- config

 build.xml

项目 B 中的 build.xml 运行良好,并在 dist 文件夹中创建了一个 jar 文件。现在,在项目 A 中,build.xml 文件应首先从项目 B 调用 build.xml,然后创建 jar 文件。不知怎的,这不起作用。如果我只是将 jar 文件从项目 B 复制到项目 A 的 lib 文件夹中,它可以工作,但我不想手动执行此操作。

我的第二个问题是项目A的最终jar文件会很大,因为lib文件夹中有很多库。我想将 jar 文件拆分为两个文件:libraries.jar(还包含项目 B 的依赖项)和 application.jar。当application.jar启动时,它应该使用libraries.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" />  

最佳答案

以下答案描述了如何使用 Apache ivy 来处理和管理具有相互依赖关系的多模块项目构建:

它演示了以下内容:

  • 每个模块都可以使用缓存文件独立构建
  • 模块构建顺序是使用 ivy buildlist 确定的任务
  • Ivy buildnumber任务用于自动生成版本号
  • Ant manifestclasspath任务可用于创建带有依赖 jar 列表的可执行 jar。

希望有帮助

关于java - 如何包含依赖项目并将 jar 拆分为两个 jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190004/

相关文章:

java - 使用 ANT 从 eclipse 功能运行测试

java.sql.SQLException : No Suitable Driver error in android app that interacts with postgres 异常

Android xml 错误 : "No resource found that matches the given name" with RelativeLayout (@id/LinearLayout_acc, @id/ProgressBar_statusScreen)

linux - Ant 构建在 Linux 机器上失败

java - 线程 "main"java.lang.NoClassDefFoundError : org/apache/qpid/proton/engine/Extendable 中出现异常

java - 重复注解需要公共(public)容器吗?

java - Tomcat 8.5 上的 Ant 重新部署失败 - 在流模式下出现 java.net.HttpRetryException : cannot retry due to server authentication,

java - 如何通过改变Java代码来改变GUI

java - 如何正确计算堆栈中的节点数?

java - 序列化 - 包重命名后失败