【问题标题】:Using Ant to build dependencies of the current build target使用 Ant 构建当前构建目标的依赖关系
【发布时间】:2017-12-22 22:52:10
【问题描述】:

假设我有一个库和一个二进制目标,我们称它们为MyLibMyBinMyBin 依赖于 MyLib

我正在尝试为 MyBin 创建一个 Ant 构建文件,它首先构建 MyLib,然后在构建 MyBin 时将其包含在类路径中。

我已经尝试使用 Ant 任务,如 Building other, dependent projects with Ant

但是,它不起作用,从ant -v 我认为MyBin build-deps 目标甚至没有构建MyLib。似乎混淆了MyBinMyLib 属性?不过我不确定如何防止这种情况发生。

我只在下面倾倒MyBin/build.xml,但MyLib 几乎相同,只是它没有build-deps 目标。

<project name="MyBin" default="main" basedir=".">
    <property name="projectName" value="MyBin" />
    <property name="src.dir" location="src" />
    <property name="build.dir" location="bin" />
    <property name="dist.dir" location="dist" />
    <property name="dist.lib.dir" location="dist/lib" />
    <property name="lib.dir" value="lib" />


<target name="build-deps" depends="init">
<!-- MyLib main target does clean -> build -> jar to dist folder -->
<!-- Its build.xml uses many of the same property values as above -->
        <ant antfile="../MyLib/build.xml" target="main"/>
</target>

<path id="classpath">
    <fileset dir="${basedir}/">
        <include name="../MyLib/dist/**/*.jar" />
    </fileset>
</path>

<!-- Need classpath to run this -->
<target name="compile" depends="build-deps" description="compile the source ">
    <javac includeantruntime="false" srcdir="${src.dir}"
                   destdir="${build.dir}" classpathref="classpath" />
</target>

<!-- Group all dependencies into a big dependency-all.jar -->
<target name="copy-dependencies">

    <mkdir dir="${dist.lib.dir}" />

    <jar jarfile="${dist.lib.dir}/dependencies-all.jar">
        <zipgroupfileset dir="${lib.dir}">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>

</target>

<!-- jar it, extract above dependency-all.jar and zip it with project files -->
<target name="jar" depends="compile, copy-dependencies"
            description="package, output to JAR">

    <mkdir dir="${dist.dir}" />
    <mkdir dir="${dist.lib.dir}" />

    <jar jarfile="${dist.dir}/${projectName}.jar" basedir="${build.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}" />
        </manifest>
        <zipfileset src="${dist.lib.dir}/dependencies-all.jar"
                            excludes="META-INF/*.SF" />
    </jar>

</target>

<target name="clean" description="clean up">
    <delete dir="${build.dir}" />
    <delete dir="${dist.dir}" />
</target>

<!-- Default, run this -->
<target name="main" depends="clean, compile, jar" />
</project>

我在ant -v in MyBin 看到的内容大致如下:

build-deps:
Project base dir set to: /MyBin
      [ant] calling target(s) [main] in build file /MyLib/build.xml
parsing buildfile /MyLib/build.xml with URI = file:/MyLib/build.xml
Project base dir set to: /MyBin
Override ignored for property "projectName"
Override ignored for property "build.dir"
Override ignored for property "dist.dir"
Override ignored for property "dist.lib.dir"
Override ignored for property "lib.dir"
[pathconvert] Set property classpath.name = 
      [ant] Entering /MyLib/build.xml...
Build sequence for target(s) `main' is [clean, init, copy-dependencies, jar, main]
Complete build sequence is [clean, init, copy-dependencies, jar, main, ]

clean:
   [delete] Deleting directory /MyBin/bin
   [delete] Deleting directory /MyBin/bin

init:
    [mkdir] Created dir: /MyBin/bin

copy-dependencies:
      [ant] Exiting /MyLib/build.xml.

【问题讨论】:

    标签: java ant


    【解决方案1】:

    关于您的具体问题:

    似乎混淆了 MyBin 和 MyLib 属性?我不确定如何 不过要防止这种情况发生。

    您正在使用它来调用 MyLib 构建:

    <ant antfile="../MyLib/build.xml" target="main" />
    

    默认情况下,通过&lt;ant&gt; 任务调用的构建会继承调用者的所有属性,包括basedir,因此构建运行在错误的位置。

    相反,您可以使用,例如:

    <ant dir="../MyLib" />
    

    这将在指定目录中运行build.xml,设置basedir 属性,并调用默认目标,如果您使用与您所说的非常相似的库构建文件,则默认目标应该是main。如果您不想在执行MyLib 任务时继承MyBin 的属性,请在任务中指定inheritAll=false

    来自&lt;ant&gt; 任务文档的dir 属性:

    用作新 Ant 项目的 basedir 的目录(除非 useNativeBasedir 设置为 true)。默认为当前项目的 basedir,除非 inheritall 已设置为 false,在这种情况下它 没有默认值。这将覆盖 basedir 设置 被调用的项目。也可以作为目录来解决 antfile 和输出属性的值(如果有)。

    【讨论】:

    • 我现在收到一条不同的错误消息,很明显它配置为遵循来自../MyLibMyBin/build.xml ant 任务,因为错误消息来自无法找到目录MyBin/build.xml 中提到了 only(我尝试过明确指定 antfile 以及仅指定 dir)。我想要一个封闭的MyLib ant 构建,然后是MyBin(然后将MyLib 输出拉到类路径中)。不过,我认为您已经为我指明了正确的方向,将花一些时间处理各种 ant 任务选项并进行报告。
    • 是的,inheritAll=false1 seemed to do the trick to force MyLib` 构建为密封的。
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2017-09-13
    • 2020-05-25
    • 2017-04-14
    相关资源
    最近更新 更多