当我尝试使用此Ant脚本进行编译时,为什么会出现这些错误?

时间:2013-10-10 12:50:06

标签: java eclipse ant jar

我是Ant的新手(我来自Maven),我发现这个简单的Ant脚本编译位于Eclipse工作区的Java项目时遇到了一些困难:

Ant脚本代码是:

<?xml version="1.0"?>
<project>

    <!-- ============================================ -->
    <!-- Load build properties                        -->
    <!-- ============================================ -->

    <property name="project.buildfile" value="build.num" />
    <property file="${project.buildfile}" />
    <property file="info.properties" />

    <!-- Elimina le cartelle contenenti le classi compilate ed i jar -->
    <target name="clean">
        <delete dir="../Release" />
        <!-- Elimina directory del jar finale -->
        <delete dir="bin" />
        <!-- Elimina directory delle classi compilate -->
    </target>

    <target name="compile">
        <mkdir dir="bin" />
        <javac srcdir="src" destdir="bin" />
    </target>
</project>

所以这个脚本有一个名为 clean 的第一个目标,它只是将2个目录删除到我的项目中(这部分工作正常)

另一个目标名为编译,它实现了与项目编译相关的2个简单任务:

1)在我的项目中创建一个名为 bin 的目录(这没关系)

2)编译 src 项目文件夹中的源代码,并将.class文件放入 bin 目录。

这里我遇到了一些问题,因为当我执行这个ant脚本时,我会收到这些错误消息:

Buildfile: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/build.xml
clean:
   [delete] Deleting directory /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/bin
compile:
    [mkdir] Created dir: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/build.xml:22: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 35 source files to /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Settings.java:12: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Settings.java:14: package com.adamtaft.eb does not exist
    [javac] import com.adamtaft.eb.EventBusService;
    [javac]                       ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Settings.java:26: cannot find symbol
    [javac] symbol  : class Logger
    [javac] location: class com.techub.crystalice.xmlhandler.Settings
    [javac]     public static final Logger logger = Logger.getLogger("gui");
    [javac]                         ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Utils.java:9: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Utils.java:16: cannot find symbol
    [javac] symbol  : class Logger
    [javac] location: class com.techub.crystalice.xmlhandler.Utils
    [javac]     private static final Logger logger = Logger.getLogger("gui");
    [javac]                          ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Settings.java:26: cannot find symbol
    [javac] symbol  : variable Logger
    [javac] location: class com.techub.crystalice.xmlhandler.Settings
    [javac]     public static final Logger logger = Logger.getLogger("gui");
    [javac]                                         ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Settings.java:130: cannot find symbol
    [javac] symbol  : variable EventBusService
    [javac] location: class com.techub.crystalice.xmlhandler.Settings
    [javac]         EventBusService.publish(new SettingsEvent(this, SettingsEventType.UPDATED));
    [javac]         ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/src/com/techub/crystalice/xmlhandler/Utils.java:16: cannot find symbol
    [javac] symbol  : variable Logger
    [javac] location: class com.techub.crystalice.xmlhandler.Utils
    [javac]     private static final Logger logger = Logger.getLogger("gui");
    [javac]                                          ^
    [javac] 8 errors
BUILD FAILED
/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceXMLHandler/Project/build.xml:22: Compile failed; see the compiler error output for details.
Total time: 1 second

为什么我有这些错误?我怎么解决?

TNX

安德烈

5 个答案:

答案 0 :(得分:1)

似乎ant无法找到所需的库/ jar。您需要在以下两个位置中拥有所需的库/ jar:

  1. ANT_HOME/lib
  2. 用户特定目录${user.home}/.ant/lib

答案 1 :(得分:1)

试试这个:

<target name="compile">
    <mkdir dir="bin" />
    <javac srcdir="src" destdir="bin" />
    <classpath>
        <fileset dir="${lib}">
            <include name="**/*.jar" />
        </fileset>
    </classpath>
</target>

答案 2 :(得分:0)

错误是存在的,因为ant不能像Maven那样满足所有依赖关系。您需要手动构建类路径并将其提供给您的javac命令。

答案 3 :(得分:0)

我不确定这可能有多大帮助,因为我是蚂蚁时的新手,但当我遇到同样的问题时,我添加了以下几行

<path id="project.classpath">
<pathelement location="${src.dir}" /> 
<path refid="external.jars" /> 
</path>

以及

<jar destfile="${dist.dir}\jarnamehere.jar">
<fileset dir="${bin.dir}" includes="**/*.class" /> 
<zipgroupfileset dir="${lib.dir}" includes="**/*.jar" /> 
</jar>

答案 4 :(得分:0)

编译Java代码时,通常依赖于其他文件中的类。例如,我有一个我出售的馅饼数据库。我写了一个课来跟踪我的馅饼库存。

另一个在我的注册中振铃交易的程序使用上面描述的饼库存类来查看饼是否可用,并将其从我的库存中删除。为了能够做到这一点,我在销售计划中include 饼库存类。但是,当我编译我的销售计划时,它需要访问饼库存类,以确保它可以正确地与它接口。

当我编译Java代码时,我必须对我的代码中引用的所有类都有一个 classpath 。因此,我需要做这样的事情:

 javac -classpath lib/pie_inventory.jar:lib/foo.jar:lib/bar.jar src/main/java/sales.java

您需要使用<javac>命令执行相同的操作。让我们看看您的错误消息:

Settings.java:12: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;

您的代码引用了org.apache.log4j 。这个包中包含您在代码中使用的类,编译需要能够检查这些类以确保您正确使用它们。我碰巧知道你需要一个名为log4j.jar的文件,这个文件必须放在你的Javac类路径中。

问题是你的工作目录中有log4j.jar吗?有两种方法可以处理这样的事情:

错误但非常非常简单。

当您需要第三方罐子时,您可以下载它们,然后手动将它们添加到您的项目中。有时这些第三方罐子需要其他第三方罐子,他们的文件通常会告诉你它们是什么。

如果您不太确定需要什么样的jar文件,请使用像Grep Code这样的工具来帮助您解决这个问题。

为什么这是错误的方式?因为罐子永远不会更新,你很快就会失去告诉他们来自哪里的能力。

正确但更困难的方式。

您应该使用将为您下载jar的依赖关系管理系统。其中有一些:

  • Maven :他们的祖父。 Maven拥有jar存储库的全球网络系统。 Maven还处理依赖项的依赖项。您只需指定您所依赖的 interfaces (我需要org.apache.logging项目中的log4j的1.2.18版本),Maven将追捕所需的jar 及其所有依赖项给你。 Maven的主要问题是它只是做得太多了。 Maven不仅仅是一个依赖管理系统。它也是一种描述项目和构建的方式。如果您正在开始一个新项目,Maven可能是一种方法,但将现有项目转换为使用Maven可能是天堂般的。

  • 蚂蚁与常春藤:Ivy做了Maven所做的所有事情,但与Ant合作。最大的两个问题是你仍然需要build.xml文件,开发人员很少知道如何做,而Ivy的文档使得Maven的稀疏文档看起来很详细。

  • Gradle Build Automation Evolved

我们现在要坚持错误的方式......


在您的项目中,您需要将所需的所有jar放入特定目录(通常${basedir}/lib是标准目录。

现在,更改您的<javac>任务以包含您的第三方广告:

自:

<javac srcdir="src" destdir="bin" />

要:

<!-- Here's all of my dependencies for compiling -->
<path id="compile.path">
    <fileset dir="${basedir}/lib"/>
</path>

<javac srcdir="src" destdir="bin" classpathref="compile.path"/>

我可以直接在我的<javac>任务中包含类路径,但我更喜欢这样做。如果您进行JUnit测试,则需要再次重用compile.path。另外,如果你转移到Ivy,你可以简单地重新定义该类路径:

<!-- Here's all of my dependencies for compiling -->
<ivy:cachepath pathid="compile.path" conf="compile"/>

<javac srcdir="src" destdir="bin" classpathref="compile.path"/>