调用另一个蚂蚁脚本的蚂蚁脚本的奇怪行为,为什么?

时间:2013-10-14 16:41:02

标签: java ant build.xml

我是Ant的新手(我来自Maven),我发现有很多问题要做以下操作。

我有一个名为 CrystalIceGUI 的主项目,它使用另一个名为 ShellExtBridge 的依赖项目。

依赖项目 ShellExtBridge 有一个自己的 build.xml 文件,用于编译项目并将其打包到一个jar文件中,该文件放入一个名为 Release的目录

主项目 CrystalIceGUI build.xml ant文件包含名为 init 的目标,该目标尝试执行构建用于构建此项目的 ShellExtBridge 依赖项目的.xml 文件,稍后在另一个目标中使用其jar。

问题是如果我执行 ShellExtBridge 的build.xml ant脚本,它运行良好并且jar文件正确地创建到其 Release 目录中(所以我认为这个ant脚本没问题但是如果我从主项目的 build.xml 中调用它,它会给我一系列错误。

这是 ShellExtBridge 依赖项目的 build.xml

<?xml version="1.0"?>
<project default="default">

    <!-- ============================================ -->
    <!-- Load build properties                        -->
    <!-- ============================================ -->

    <property name="project.buildfile" value="build.num" />
    <property file="${project.buildfile}" />
    <property file="info.properties" />


    <!-- ============================================ -->
    <!-- The default target                           -->
    <!-- ============================================ -->

    <target name="default" depends="jar" />

    <!-- Elimina le cartelle contenenti le classi compilate ed i jar -->
    <target name="clean">
        <echo message="Into ShellExtBridge build.xml clean target"/>
        <delete dir="../Release" />
        <!-- Elimina directory del jar finale -->
        <delete dir="bin" />
        <!-- Elimina directory delle classi compilate -->
    </target>


    <!-- Contiene i task di COMPILAZIONE: 
         1) Crea la directory "bin/" nel progetto
         2) Compila tutte le classi dentro la cartella "src" del progetto e mette i risultanti .class
            dentro "bin"
    -->
    <target name="compile" depends="clean">
        <echo message="Into ShellExtBridge build.xml compile target"/>
        <mkdir dir="bin" />
        <javac srcdir="src" destdir="bin" />
    </target>

    <target name="jar" description="Packs classes of shellextbridge" depends="compile">
        <echo message="Into ShellExtBridge build.xml jar target"/>
        <jar destfile="../Release/shellExtBridge.jar" index="false">
            <fileset dir="bin" />
            <manifest>
                <attribute name="Created-By" value="${info.software.author}" />
                <attribute name="Main-Class" value="com.techub.crystalice.rmi.Main" />
            </manifest>
        </jar>

    </target>

</project>

这是主项目 CrystalIceGUI build.xml 文件的 init 目标:

<target name="init">


        <ant antfile="${basedir}../../../ShellExtBridge/Project/build.xml" />
</target>

如果我执行此ant脚本的 init 目标,我会收到以下错误:

Buildfile: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/build.xml
init:
clean:
     [echo] Into ShellExtBridge build.xml clean target
   [delete] Deleting directory /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
compile:
     [echo] Into ShellExtBridge build.xml compile target
    [mkdir] Created dir: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 117 source files to /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/utils/QuickLocale.java:8: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/fuse/AtmosFuseWrapper.java:8: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/fuse/AtmosFuseWrapper.java:11: package com.techub.crystalice.jaxb.settings does not exist
    [javac] import com.techub.crystalice.jaxb.settings.DriveType;
    [javac] 
...............................................................................
...............................................................................
ETCETCETC MANY OTHERS SIMILAR ERRORS
...............................................................................
...............................................................................
BUILD FAILED
/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/build.xml:70: The following error occurred while executing this line:
/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37: Compile failed; see the compiler error output for details.

正如您所看到的那样,似乎依赖 ShellExtBridge 项目的 build.xml ant脚本被调用,因为此ant的回显消息脚本显示。

但有一些奇怪的事情,因为当调用 ShellExtBridge 的build.xml脚本时执行以下操作:

[echo]进入ShellExtBridge build.xml清理目标     [删除]删除目录/ home / andrea / Documenti / XCloud / Implementazione / CrossPlatform / CrystalIceGUI / Project / bin 编译:      [echo]进入ShellExtBridge build.xml编译目标      [mkdir]创建目录:/ home / andrea / Documenti / XCloud / Implementazione / CrossPlatform / CrystalIceGUI / Project / bin     [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37:警告:'includeantruntime'未设置,默认为build.sysclasspath = last;对于可重复的构建设置为false

删除此目录 / home / andrea / Documenti / XCloud / Implementazione / CrossPlatform / CrystalIceGUI / Project / bin 而不是正确的目录,该目录是与中的bin目录相关的目录ShellExtBridge 项目。

似乎是这样,当它调用 ShellExtBridge 项目的ant文件时,丢失了它的引用并对主项目的文件夹而不是正确的项目执行操作。

你对解决它有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我觉得修复起来非常简单。 <ant>任务将使用当前目录作为工作目录,除非您指定dir属性(此外,如果要运行的目标文件名为build.xml,则可以省略antfile属性)。

所以,这里是我建议的初始目标:

<target name="init">
    <ant dir="${basedir}../../../ShellExtBridge/Project" />
</target>

这是关于dir属性的官方文档:

  

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

答案 1 :(得分:1)

我无法单独使用diruseNativeBasedir选项(使用Ant 1.9.3)。我必须提供inheritall="false"并指定子Ant构建的dir选项以使用正确的basedir:

<target name="stage" depends="init">
    <ant antfile="../otherproject/build.xml" inheritall="false" dir="../otherproject">
</target>