当前位置: 首页 > 知识库问答 >
问题:

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

韩智明
2023-03-14

我对Ant非常陌生(我来自Maven),我发现了很多问题来做下面的操作。

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

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

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

问题是,如果我执行ShellExtBridge的build.xml ant脚本,它工作得很好,并且jar文件被正确地创建到其发布目录中(所以我认为这个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脚本的回显消息。

[echo]到ShellExtBridge build.xml清除目标[delete]删除目录/home/andrea/documenti/xcloud/implementazione/crossplatform/crystaliceGui/project/bin编译:[echo]到ShellExtBridge build.xml编译目标[mkdir]创建dir:/home/andrea/documenti/xcloud/implementazione/crossplatform/crystaliceGui/project/bin为可重复生成设置为false

它删除了这个目录/home/andrea/documenti/xcloud/implementazione/crossplatform/crystaliceGui/project/bin,而不是与ShellExtBridge项目中的bin目录相关的正确目录。

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

你有解决它的想法吗?

共有1个答案

林德华
2023-03-14

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

因此,这里是我建议的init目标:

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

下面是关于dir属性的官方文件:

 类似资料:
  • 问题内容: 在定义顺序构建步骤时,我使用元素的属性。我最近看到了一个ant文件,其中的构建顺序是由目标内部的元素定义的。为了显示 : 与 两种方法之间是否有真正的区别?是其中之一更可取吗? 问题答案: 与这两种方法的主要区别在于目标是 始终 执行,而在目标只有在包含目标是执行。 一个澄清的例子: 在这里,将始终执行,而只有在定义时才会执行。 在此,仅当is即定义时才执行。

  • 问题内容: 我正在尝试使用ant在命令行上生成apk。我可以使用ant clean,但是对于ant调试和ant release命令,我得到以下错误。 建立失败 C:\ Android \ sdk \ tools \ ant \ build.xml:649:执行此行时发生以下错误:C:\ Android \ sdk \ tools \ ant \ build.xml:694:执行失败:java.io

  • 进程线程 怪异盒模型 动画 绝对定位 why React hook? useState原理 为什么不能if else里 微前端架构why 与spa区别 跨域

  • 感觉蚂蚁面的好难啊,前端面试要手写 Promise,直接给我干抑郁了😭#蚂蚁求职进展汇总#

  • 我不熟悉蚂蚁脚本。 以下是需求描述 在我的工作区中,有各种各样的项目,我必须在RAD和eclipse IDE以及Websphere、tomcat和jboss环境中进行项目工作。。我已经做了特定于项目的设置,以使项目在RAD、websphere、eclipse和tomcat n jboss上工作。。 但是在一些文件中有一些变化,比如classpath n和一些配置文件。 这就给我留下了三个版本的工作

  • - 项目略 - B+树有什么特点 - 对一个表设计索引需要注意的细节?多表查询索引优化 - 事务的隔离级别 - 可重复读什么? - 悲观锁和乐观锁 - 对JVM了解,JVM是什么结构,由那几部分组成 - docker如何实现多容器,原理, 如何实现隔离 - 线程池参数及其含义 - 拒绝策略类型 - 快排 原理 具体怎么做的 - Spring AOP 具体是什么意思 设计模式 - - 场景题:假设我