我是apache ant的新手,我目前正在开发一个apache Ant项目。我刚开始,将项目导入工作区并尝试运行build.xml。我将原始项目附带的所有库添加到构建路径中。我有以下问题。请其他人编写代码,我应该改进它。这个目录都存在于项目目录中。
BUILD FAILED
C:\workspace\MyApp\build.xml:83: srcdir "C:\workspace\MyApp\${compile.javac.srcdir}" does not exist!
错误代码引用了build.xml文件的以下部分
<target name="compile.default" depends="init">
<javac fork="yes" srcdir="${compile.javac.srcdir}" destdir="${compile.javac.destdir}" includes="${compile.javac.include}" excludes="${compile.javac.exclude}" classpath="${compile.javac.classpath}" debug="${compile.javac.debug}" optimize="${compile.javac.optimize}" deprecation="${compile.javac.deprecation}" verbose="${compile.javac.verbose}">
</javac>
<copy todir="${compile.javac.destdir}">
<fileset dir="${compile.javac.srcdir}" includes="${compile.copy.include}" excludes="${compile.copy.exclude}"/>
</copy>
</target>
<target name="compile" depends="init,compile.default" description="Compile all java source">
</target>
<!--+++++++++++++++-->
<!-- lib target(s) -->
<!--+++++++++++++++-->
<target name="lib.default" depends="init,compile">
<xmlbean schema="config/schemas/validate/1.0/validate.xsd" destfile="lib/glx-beans.jar" classpath="lib/xbean.jar:lib/jsr173_1.0_api.jar" />
<jar jarfile="${lib.filename}">
<fileset dir="${lib.srcdir}" excludes="${lib.exclude}" />
</jar>
</target>
<target name="lib" depends="init,compile,lib.default" description="Create all Project Libraries">
</target>
请你告诉我我错过了什么?
答案 0 :(得分:2)
${compile.javac.srcdir}
未定义。有几种可能性:
build.xml
中定义的,而是在某种属性文件中定义的。在构建脚本中查看是否有类似<property file="..."/>
的内容。我的建议是在build.xml
文件中定义所有属性,并使用属性文件覆盖这些设置。这样,开发人员在build.xml
文件中需要的唯一构建文件,并且不必担心设置单独的build.porperties
文件。build.xml
文件中定义的,但您忘了说您使用此目标的目标依赖于此任务。 您可以做的一件事是在运行Ant时使用-d
参数。在使用-d
参数运行Ant时运行以下命令:
$ and -d 2>&1 | tee ant.out
然后我可以查看ant.out
并查看我是否以某种方式定义了该特定属性。也许我的错误大写或错误拼写了属性名称。例如,我很可能将该属性定义为 copmile.javac.srcdir ,因为我不知道如何拼写。查看-d
输出可以快速指出这些类型的错误。
顺便说一下,您不应该让所有任务都依赖于init
,因为他们依赖于compile.default
:
<target name="compile.default" depends="init">
....
</target>
<target name="compile" depends="compile.default">
....
</target>
<target name="lib" depends="compile,lib.default">
....
</target>
如果我运行目标lib
,则会看到compile
依赖于compile.default
,这取决于init
。因此,您的构建将运行init
,然后是compile.default
,然后是compile
,然后是&#39; lib.default and finally
lib`。
如果init任务只是设置属性,则可以在任何任务之外执行此操作。然后,将在执行任何任务之前设置这些属性。这样,他们就不会忘记。如果您的init
也在创建目录,则可能需要在使用该目录的任务前移动这些<mkdir/>
任务。例如,您可能希望在javac
任务之前在<javac/>
中使用 destdir 。
我发现在任何任务之外分配默认属性,并在需要之前创建目录以简化build.xml
。另外,如果用户只是编译而不是打包jar / war / etc,那么你就不会创建一大堆未使用的目录。