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

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

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

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

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

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

这是ShellExtBridge依赖项目的build.xml

                                     

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

    

如果我去执行这个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脚本的echo消息

但是有一些奇怪的事情,因为当调用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,而不是正确的目录,该目录是与ShellExtBridge项目中的bin目录相关的目录。

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

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

我认为解决起来很简单。 除非您指定dir属性,否则任务将使用当前目录作为工作目录(此外,如果要运行的目标文件名为build.xml,则可以省略antfile属性)。

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

    

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

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

我无法使用diruseNativeBasedir选项自行工作(使用Ant 1.9.3)。 我必须提供inheritall="false"并指定sub-Ant构建的dir选项以使用正确的basedir: