1

我是 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 个目录删除到我的项目中(这部分工作得很好)

另一个目标名为compile,它实现了与项目编译相关的 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

为什么我有这些错误?我该如何解决?

肿瘤坏死因子

安德烈亚

4

5 回答 5

1

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

  1. ANT_HOME/lib
  2. 用户特定的目录,${user.home}/.ant/lib
于 2013-10-10T12:54:50.210 回答
1

尝试这个:

<target name="compile">
    <mkdir dir="bin" />
    <javac srcdir="src" destdir="bin" />
    <classpath>
        <fileset dir="${lib}">
            <include name="**/*.jar" />
        </fileset>
    </classpath>
</target>
于 2013-10-10T12:54:54.510 回答
0

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

于 2013-10-10T12:55:20.563 回答
0

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

另一个在我的收银机上调用交易的程序使用上述我的派库存类来查看派是否可用,并将其从我的库存中删除。为了能够做到这一点,我在我的销售计划中include使用了馅饼库存类。但是,当我编译我的销售程序时,它需要访问pie 库存类以确保它可以正确地与它交互。

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

 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 package。这个包包含您在代码中使用的类,编译需要能够检查这些类以确保您正确使用它们。我碰巧知道您需要一个名为的文件log4j.jar,并且必须将其放入您的 Javac 类路径中。

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

错误但非常非常简单的方法。

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

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

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

正确的,但更困难的方法。

你应该使用一个依赖管理系统来为你下载 jars。其中有几个:

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

  • Ant 与 Ivy:Ivy 与 Maven 所做的所有事情相同,但与 Ant 一起工作。最大的两个问题是你仍然需要开发人员很少知道怎么做的 build.xml 文件,而 Ivy 的文档让 Maven 的稀疏文档看起来很详细。

  • Gradle构建自动化进化

我们现在将坚持真正错误的方式......


在你的项目中,你需要把你需要的所有 jars 放到一个特定的目录中(通常${basedir}/lib是标准的.

现在,更改您的<javac>任务以包括您的第三方 jar:

从:

<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"/>
于 2013-10-10T14:08:31.130 回答
0

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

<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>
于 2013-10-10T13:01:29.643 回答