我在eclipse中构建了一个swing gui,它应该运行以前开发的一堆代码,其中一部分涉及运行ant来构建代码。当我在GUI之外(在原始项目中)运行任何脚本时,ant会正确执行并构建项目。但是,当我尝试以编程方式运行ant时,它会抛出错误,看起来项目没有必要的.jar。下面列出了build.xml顶部的代码和错误。
代码块File buildFile = new File("lib\ePlay\build.xml");
Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try {
p.fireBuildStarted();
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
} catch (BuildException e) {
p.fireBuildFinished(e);
}
build . xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="EPlay" xmlns:ivy="antlib:org.apache.ivy.ant" default="resolve">
<dirname file="${ant.file}" property="ant.dir" />
<property name="scm.user" value="scmrel"/>
<property name="scm.user.key" value="/.ssh/scmrel/id_rsa"/>
<property name="ivy.jar" value="ivy-2.0.0.jar" />
<property name="ivy.settings.dir" value="${ant.dir}/ivysettings" />
<property name="VERSION" value="LATEST" />
<property name="tasks.dir" value="${ant.dir}/.tasks" />
<property name="deploy.dir" value="${ant.dir}/deploy" />
...
<!-- retrieve the dependencies using Ivy -->
<target name="resolve" depends="_loadantcontrib,_getivy" description=" retrieve the dependencies with Ivy">
<ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
<ivy:resolve file="${ant.dir}/ivy.xml" transitive="false" />
<ivy:retrieve pattern="${deploy.dir}/[conf]/[artifact].[ext]"/>
</target>
和错误
resolve:
BUILD FAILED
H:eclipseCLDeploySwinglibePlaybuild.xml:66: Problem: failed to create task or type antlib:org.apache.ivy.ant:settings
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
No types or tasks have been defined in this namespace yet
This appears to be an antlib declaration.
Action: Check that the implementing library exists in one of:
-ANT_HOMElib
-the IDE Ant configuration dialogs
Total time: 0 seconds
我已经检查了我的ant安装,它出现一切都在那里。如前所述,如果在此应用程序之外运行build.xml,则原始项目将成功构建。
我认为这是因为您的java程序没有与正常ant构建相同的运行类路径,因此ANT_HOME不是正确的。
您可以通过向JVM传递正确的环境变量,或者简单地调用System.getProperty("ANT_HOME")来确保这是正确的,以查看ANT_HOME实际驻留的位置。
我认为你的项目${basedir}
计算不正确。
将这行添加到build.xml
<echo message="basedir='${basedir}'/>
看这一行
File buildFile = new File("lib\ePlay\build.xml");
它可能是2级以上(我知道文档说它应该是build.xml的父目录,但你不是从命令行运行)。
而不是使用在项目声明中使用命名空间的新方法来加载ivy库。
<path id="ivy.lib.path">
<fileset dir="path/to/dir/with/ivy/jar" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
我正在Gradle中做一些需要这个
的事情ant.taskdef(name: 'ivy-retrieve', classname: 'org.apache.ivy.ant.IvyRetrieve', classpath: '...path to ivy jar.../ivy-2.2.0.jar')
在ant中应该是
<taskdef name="ivy-retrieve" classname="org.apache.ivy.ant.IvyRetrieve"/>
我知道它更笨拙,而且没有包含命名空间声明那么好,但它确实消除了关于在哪个类路径上加载哪些库的一些混乱。