我是 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
为什么我有这些错误?我该如何解决?
嘟嘟
安德里亚
似乎蚂蚁无法找到所需的库/罐子。您需要在以下两个位置之一中拥有所需的库/jar:
-
ANT_HOME/lib
- 用户特定的目录,
${user.home}/.ant/lib
试试这个:
<target name="compile">
<mkdir dir="bin" />
<javac srcdir="src" destdir="bin" />
<classpath>
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</classpath>
</target>
错误之所以存在,是因为 ant 没有像 Maven 那样满足所有依赖关系。您需要手动构建一个类路径并将其提供给 javac 命令。
我不确定这会有多大帮助,因为我是蚂蚁的新手,但是当我遇到同样的问题时,我添加了以下行
<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>
编译 Java 代码时,通常依赖于其他文件中的类。例如,我有一个出售馅饼的数据库。我写了一个类来跟踪我的馅饼库存。
另一个在我的收银机上响起交易的程序使用上面描述的饼图库存类来查看馅饼是否可用,并将其从我的库存中删除。为了能够做到这一点,我在销售计划中include
了该饼图库存类。但是,当我编译我的销售程序时,它需要访问饼图库存类,以确保它可以正确与之交互。
当我编译 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
包。此包包含您在代码中使用的类,编译需要能够检查这些类以确保正确使用它们。我碰巧知道你需要一个名为log4j.jar
的文件,它必须放在你的Javac类路径中。
问题是您的工作目录中有此log4j.jar
吗?有两种方法可以处理这样的事情:
错误但非常简单的方法。
当您需要第三方 jar 时,您可以下载它们,然后手动将它们添加到您的项目中。有时这些第三方罐子需要其他第三方罐子,他们的文档通常会告诉你它们是什么。
如果你不太确定你需要什么jarfile,请使用像Grep Code这样的工具来帮助你解决这个问题。
为什么这是错误的方式?因为罐子永远不会更新,你很快就会失去分辨它们来自哪里的能力。
正确的,但更困难的方法。
您应该使用将为您下载 jar 的依赖项管理系统。其中有几个:
Maven:他们所有人的祖父。Maven拥有jar存储库的全球网络系统。Maven 还处理依赖项的依赖项。您只需指定所依赖的接口(我需要来自org.apache.logging项目的log4j版本1.2.18(,Maven将为您找到所需的jar及其所有依赖项。Maven的主要问题是它做得太多了。Maven不仅仅是一个依赖管理系统。这也是描述项目和构建的一种方式。如果你正在开始一个新项目,Maven可能是一条路,但是将现有项目转换为使用Maven可能是地狱。
Ant with Ivy:Ivy 做 Maven 做的所有事情,但与 Ant 一起工作。两个最大的问题是你仍然需要构建.xml文件,开发人员很少知道如何做,而 Ivy 的文档使 Maven 的稀疏文档看起来很详细。
Gradle:构建自动化进化了!
我们现在将坚持真正错误的方式...
<小时 />在你的项目中,你需要把你需要的所有jar放到一个特定的目录中(通常是标准的${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
。另外,如果你搬到常春藤,你可以简单地重新定义这个类路径,稍微不同一点:
<!-- Here's all of my dependencies for compiling -->
<ivy:cachepath pathid="compile.path" conf="compile"/>
<javac srcdir="src" destdir="bin" classpathref="compile.path"/>