我是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文件时,丢失了它的引用并对主项目的文件夹而不是正确的项目执行操作。
你对解决它有什么想法吗?
答案 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)
我无法单独使用dir
或useNativeBasedir
选项(使用Ant 1.9.3)。我必须提供inheritall="false"
并指定子Ant构建的dir选项以使用正确的basedir:
<target name="stage" depends="init">
<ant antfile="../otherproject/build.xml" inheritall="false" dir="../otherproject">
</target>