使用Ant构建当前构建目标的依赖关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Ant构建当前构建目标的依赖关系相关的知识,希望对你有一定的参考价值。

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

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

我在Building other, dependent projects with Ant尝试过使用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.
答案

关于你的具体问题:

看起来它混淆了MyBin和MyLib属性?我不知道如何防止这种情况。

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

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

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

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

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

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

来自<ant>任务文档的dir属性:

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

以上是关于使用Ant构建当前构建目标的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在ANT构建中的多个目标“依赖”属性中使用一个目标?

ANT--------构建文件build.xml

查找未使用的gradle运行时依赖项

Ant 到 Maven - 多个构建目标

IVY - 多项目本地构建 - 模仿“解决工作空间中的依赖关系”

maven入门基础