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

标签 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>

这是主项目CrystalIceGUIbuild.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 的 echo messages显示脚本。

但是有一些奇怪的事情,因为当调用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;对于可重复build设置为 false

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

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

您有解决这个问题的想法吗?

最佳答案

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

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

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

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

dir: the directory to use as a basedir for the new Ant project (unless useNativeBasedir is set to true). Defaults to the current project's basedir, unless inheritall has been set to false, in which case it doesn't have a default value. This will override the basedir setting of the called project. Also serves as the directory to resolve the antfile and output attribute's values (if any).

关于java - ant 脚本调用另一个 ant 脚本的奇怪行为,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19365001/

相关文章:

java - 使用签名的 jwt token 连接开发者 Apple Store 连接

java - 数据库交互后重定向

java - 哪里可以下载 ANT 1.8.3 的预发行版本?

eclipse - Ant 新手 - 相对路径问题

java - WorkbenchPage.openEditor() 不执行任何操作

java - 通过 EventListener 调用 repaint() 和/或 revalidate() - Swing

ant - 为 ant 脚本设置环境变量

java - Ant 构建 - javac 任务 - 排除目录然后包含子目录

Grails create-app 不生成 build.xml?

android - build.xml 在编译包含 ArduinoAdkUsb 的 Processing sketch 时出错