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



我对 Ant 很陌生(我来自 Maven),我发现做以下操作有很多问题。

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

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

主项目 CrystalIceGUI 有它的 build.xml ant 文件,其中包含一个名为 init 的目标,该目标尝试执行 ShellExtBridge depency 项目的 build.xml 文件来构建这个项目,然后,在另一个目标中使用它的 jar。

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

这是 ShellExtBridge 依赖项项目的构建.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>

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

<target name="init">

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

如果我去执行这个 ant 脚本的初始化目标,我会得到这些错误:

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 的构建.xml脚本时,执行以下操作:

[echo] 进入 ShellExtBridge 构建.xml清理目标 [删除] 删除目录/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin编译: [回声]进入 ShellExtBridge 构建.xml编译目标 [mkdir] Created dir:/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,而不是与 ShellExtBridge 项目中的 bin 目录相关的正确目录。

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

你有一些想法来解决它吗?

我认为修复起来非常简单。<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 和输出属性的值(如果有)的目录。

我无法仅获得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>

最新更新