我目前ANT_HOME找到了/home/<myuser>/ant/1.8.4/ant-1.8.4.
我刚刚下载了包含其依赖项的Apache Ivy tarball.我把它提取到了/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1.
然后我复制/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jar到ANT_HOME/lib.如果我理解Ant如何使用插件/扩展是正确的,那么Ant现在应该能够在运行时访问所有Ivy的任务.
我的下一个问题是,如何在我的Ant构建文件中定义常春藤任务?说我想用ivy-retrieve,ivy-resolve和ivy-publish任务.当我从命令行运行Ant构建时,我需要做的所有配置(在XML中)以使这些任务正常工作(我不会通过Ant-Eclipse插件构建).提前致谢!
当使用taskdef声明外部ant任务时,例如ant-contrib,建议的设置是使用followin taskdef:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)
当antcontrib.properties位于net/sf/antcontrib相对于build.xml文件时,这种方法有效.
但是当我把它放在lib/net/sf/antcontrib中并将taskdef更改为
<taskdef resource="lib/net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)
Ant无法找到属性文件,它会给出错误
[taskdef] Could not load definitions from resource
lib/net/sf/antcontrib/antcontrib.properties. It could not be found.
Run Code Online (Sandbox Code Playgroud)
似乎ant分别处理lib目录并且无法从那里加载taskdef资源.
我在Ant中定义了一个新任务.我将其导出为jar并添加到我的构建文件中:
<taskdef classname="X" classpath="Y.jar"/>
Run Code Online (Sandbox Code Playgroud)
问题是这在运行时失败了.它告诉我它没有找到班级.通过将jar添加到类路径,它已得到纠正.
我的问题是:有没有办法可以从Ant构建文件中引用我的jar,而不更改类路径?
我有一个构建文件,作为构建过程的一部分依赖于几个taskdef.这些taskdef项(例如,webdoclet和jasper2)使用log4j作为记录器.理想情况下,我希望能够为每个提供不同的log4j配置文件,但最低限度,我希望能够指定使用哪个log4j配置文件.
我以前做的工作是在类路径的前面放置包含我希望taskdef使用的log4j.xml的目录.例如:
<target name="define.jasper2">
<path id="jspc.classpath">
<!-- Put this FIRST so Jasper will find the log4j.xml in the Build directory -->
<pathelement location="Build"/>
<fileset dir="${tomcat.libs}">
....
</fileset>
<pathelement location="${log4j.jar}"/>
....
</path>
<taskdef name="jasper2" classname="org.apache.jasper.JspC" classpathref="jspc.classpath"/>
</target>
事实上,我已经验证了"Build"目录位于类路径的前面,并且该目录中存在log4j.xml.但是,当我在调试时使用log4j以详细模式运行ant时,我看到log4j正在选择当前工作目录中的log4j.xml ,这不是我想要的.Log4j似乎没有使用类路径来解析默认的log4j.xml.
我正在使用log4j 1.2.8(嵌入在一个更大的框架中,所以我无法升级它),其中一些taskdef似乎依赖于commons-logging 1.0.3.构建过程使用Sun Java 5.
如果我set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml在运行ant之前,taskdefs正确加载了所需的log4j.xml.
将"Build"目录放在类路径的前面,用于工作的taskdef.我不知道改变了什么.如何恢复我可以控制的行为 - 在build.xml中 - 哪个log4j配置文件用于给定任务?除了设置ANT_OPTS以外,还有其他方法可以将应用程序的log4j.xml移出当前工作目录以使log4j找到正确的log4j.xml文件吗?
我是Ant的新手.有人可以告诉我为taskdef的'classpathref'提供什么值?它会是类文件的路径吗?如果是,可以给出一个例子,因为我尝试了它并且它不适合我.
使用创建子项目,如Ant任务 <antcall>,并<ant>可能导致测试失败重复调用因下列错误之一时:
只有在使用<typedef>或<taskdef>使用捆绑的任务时才会出现调用的任务之一时出现错误,例如<javadoc>.
有没有办法避免OutOfMemoryError不增加最大Java堆大小?虽然增加堆大小可以工作一段时间,但如果添加更多内存密集型任务,问题仍然会重新出现.
以下示例任务和关联build.xml文件导致
OutOfMemoryError我的Linux机箱上的Java堆设置为10 MB(用于测试).Ant任务构造了一个需要内存的对象(在这种情况下是一个Closure模板大豆模块的Guice注入器),然后使用它重复调用<antcall>.
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.template.soy.SoyModule;
import org.apache.tools.ant.Task;
/** Custom Ant task that constructs a Guice injector. */
public final class CreateGuiceInjectorTask extends Task {
private Injector injector;
public CreateGuiceInjectorTask() {
injector = Guice.createInjector(new SoyModule());
}
public void execute() {
System.out.println("Constructed Guice injector...");
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8"?>
<project name="out-of-memory-test" basedir="."> …Run Code Online (Sandbox Code Playgroud)