【问题标题】:Why I have these errors when I try to compile using this Ant script?当我尝试使用此 Ant 脚本进行编译时,为什么会出现这些错误?
【发布时间】:2013-10-10 12:50:06
【问题描述】:

我是 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,它实现了两个与项目编译相关的简单任务:

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

安德烈亚

【问题讨论】:

    标签: java eclipse ant jar


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

      • 在尝试您的解决方案之前,我会告诉您,我的项目中已经有一个 lib 目录,并且该目录包含一些 jar 文件。您的“编译”版本究竟是什么目标?
      • 似乎在编译时 ant 没有找到你的库,这包括在类路径中
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我不确定这有多大帮助,因为我是 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>
        

        【讨论】:

          【解决方案5】:

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

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

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

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

          您需要对&lt;javac&gt; 命令执行相同的操作。让我们看看你的错误信息:

          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 时,您可以下载它们,然后手动将它们添加到您的项目中。有时这些第三方 jar 需要其他第三方 jar,它们的文档通常会告诉您它们是什么。

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

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

          正确的方法,但要困难得多。

          您应该使用可以为您下载 jar 包的依赖管理系统。其中有几个:

          • 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 的稀疏文档看起来很详细。

          • GradleBuild Automation Evolved!

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


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

          现在,更改您的 &lt;javac&gt; 任务以包含您的第三方 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"/>
          

          我本可以将类路径直接包含在我的&lt;javac&gt; 任务中,但我更喜欢这样做。如果您进行 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"/>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-14
            • 2022-09-23
            • 1970-01-01
            • 2020-06-30
            • 2011-03-09
            • 1970-01-01
            • 1970-01-01
            • 2021-06-27
            相关资源
            最近更新 更多