【问题标题】:compiling nested jars using ant使用 ant 编译嵌套 jar
【发布时间】:2012-01-09 00:30:36
【问题描述】:

我有一个 Java 项目,Parent,它依赖于一个 Child 子项目(以 JAR 的形式)。这个Child 依赖于库AB,它们与Child 捆绑在一起。 Parent 也使用 AB(表示直接调用,而不是通过 Child 间接调用。我希望能够在我的项目中仅包含一次 AB JAR。

当我编译 Parent 时,当它引用库 AB 时,我得到一个 cannot find symbol。我相信这是因为Child 在编译时路径上,但由于某种原因其中的库不在。

我使用 ant 作为我的构建工具 - 我应该在我的 javac 标记中为嵌套 jar 做些什么特别的事情?现在在Parent's build.xml 我有:

<target name="compile" depends="clean, makedir">
    <javac 
        srcdir="${src.dir}"
        destdir="${build.dir}"
        includeantruntime="false"
        classpathref="build.classpath">
    </javac>
</target>

<path id="build.classpath">
    <fileset dir="${lib.dir}">
        <include name="**/*.jar" />
    </fileset>
</path>

这应该包括我的 lib 文件夹中存在的所有 jar,但它似乎没有包括 jar 中的所有 jar。

【问题讨论】:

    标签: java ant jar classpath


    【解决方案1】:

    我假设A.jarB.jar 是第三方库,而不是您自己构建的输出。

    在这种情况下,解决此问题的一种方法是为第三方库创建一个项目或目录,然后您的多个项目可以使用这些库。在您描述的环境中,您的 Child 项目会将它们捆绑到自己的构建输出中,Parent 项目将直接在其类路径中使用它们。

    假设您在文件系统中与其他项目相同的级别创建 thirdparty 项目:

      thirdparty
        lib
          A.jar
          B.jar
      Parent
        build.xml
        src
      Child
        build.xml
        src
    

    在您的构建文件中,您可以定义第三方项目的位置:

    <property name="thirdparty" value="../thirdparty"/>
    

    并在路径中引用它:

    <include name="${thirdparty}/lib/A.jar"/>
    <include name="${thirdparty}/lib/B.jar"/>
    

    【讨论】:

      【解决方案2】:

      我的问题源于 Java 无法在 jar 中本地引用 jar。您需要使用 http://one-jar.sourceforge.net/ 之类的东西来绕过它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2012-03-13
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多