- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 Ant 任务创建子项目,例如 <antcall>
和 <ant>
由于以下错误之一,重复调用时可能会导致构建失败:
仅当调用的任务之一是使用 <typedef>
定义时才会发生错误或 <taskdef>
并且在使用与 Ant 捆绑在一起的任务时不会出现,例如 <javadoc>
.
有没有办法避免 OutOfMemoryError
不增加最大 Java 堆大小?虽然增加堆大小适用于同时,如果添加更多内存密集型任务,问题仍然会再次出现。
以下示例任务与build.xml
相关联文件导致 OutOfMemoryError
在我的 Linux 机器上,Java 堆设置为 10 MB(对于测试)。 Ant 任务构造一个内存消耗大的对象(在本例中是一个 Guice封闭模板大 bean 模块的注入(inject)器),然后重复调用使用 <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...");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project name="out-of-memory-test" basedir=".">
<property name="build.dir" location="${basedir}/build" />
<property name="CreateGuiceInjectorTask.jar"
location="${build.dir}/CreateGuiceInjectorTask.jar" />
<taskdef name="create-injector"
classname="CreateGuiceInjectorTask"
classpath="${CreateGuiceInjectorTask.jar}" />
<target name="call-create-injector">
<create-injector />
</target>
<target name="test"
description="Create multiple injectors until out of memory">
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
</target>
</project>
$ ant test
test:
call-create-injector:
[create-injector] Constructed Guice injector...
call-create-injector:
[create-injector] Constructed Guice injector...
...
call-create-injector:
BUILD FAILED
Could not create type create-injector due to java.lang.OutOfMemoryError: Java heap space
最佳答案
使用 Keith Gregory's方法描述here我能够解决内存问题,至少对于您发布的简单示例代码而言。
概括地说,问题是每次您通过 antcall
使用 taskdef 时,Ant 使用不同的类加载器,因此您会立即吃掉您的 permgen。要确认这一点,您可以修改您的类以打印类加载器哈希码 - 您会在每次迭代中看到它的不同。
解决方法是将您的 taskdef 打包为 antlib并使用 antlib 命名空间来加载它。结果是使用了 Ant 自己的类加载器。为此,您必须将该类放在 Ant 类路径中。
为了对此进行测试,我将您的测试类放入包命名空间(称为 memtest)中,进行编译,然后在包目录中添加一个 antlib.xml,如下所示:
<antlib>
<taskdef name="create-injector" classname="memtest.CreateGuiceInjectorTask" />
</antlib>
构建文件项目声明更改为
<project name="out-of-memory-test" basedir="." default="test" xmlns:mt="antlib:memtest">
和目标
<target name="call-create-injector">
<mt:create-injector />
</target>
为了测试,我将所有需要的东西都放在了 Ant 类路径中。它成功运行了许多 antcalls,并且类加载器哈希码的调试打印确认使用了预期的单个实例。
Ant documentation for the antlib namespace 中有一条注释上面写着“资源位于默认类路径中的要求可能会在 Ant 的 future 版本中删除”。根据实现方式的不同,变通办法将来可能会中断。
关于java - Ant taskdef - PermGen 空间用完,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662614/
我正在 Ant 中定义一个新任务。 我将它导出为 jar 并添加到我的构建文件中: 问题是这在运行时失败。 它告诉我它没有找到类。 通过将 jar 添加到类路径,它被纠正。 我的问题是:有没有一种方
我是 Ant 的新手。 有人可以告诉我为taskdef的'classpathref'设置什么值吗? 它会是类文件的路径吗? 如果是,可以举个例子,因为我试过了,但对我不起作用。 最佳答案 在 task
项目foo定义了一些在根项目中使用的ant任务。对于复合构建: setting.gradle includeBuild '../foo' build.gradle configurations {
假设我有一个已经给出的 build.xml 。我被命令添加自己的任务来检查某些条件,如果未设置则让构建失败。 在此 build.xml 中已经定义了一些任务。所以我想我可以简单地编写自己的任务,将其像
这与 .我正在尝试使用 Grape 动态添加 maven-ant-tasks jar,模拟以下内容: 我尝试使用 Grape.grab() 使 maven-ant-tasks 可用于 AntBu
我有一个 build.xml 文件,其中包含用于调用 java 类的 taskdef 操作。在下面附加的代码中,我使用 build.xml 中的 taskdef 操作调用两个不同的 java 类 He
我正在研究一些 java 静态分析工具。 findbugs、checkstyle、javancss、pmd 和 jdepend。之前关于工具推荐的 stackoverflow 问题 Static An
全部 - 我正在遵循此页面上最简单的说明: http://ant.apache.org/manual/develop.html 但是,当我尝试执行目标“main”时,我在 netbeans 中遇到了这
使用 Ant 任务创建子项目,例如 和 由于以下错误之一,重复调用时可能会导致构建失败: java.lang.OutOfMemoryError: PermGen 空间 java.lang.OutOfM
我正在尝试使用 axis-java2wsdl ant 任务从我的一个 java 类创建 wsdl,但我无法获得正确的类路径。 我正在使用 Ubuntu 的 libaxis-java 包,它在 $ANT
本文整理了Java中org.apache.tools.ant.taskdefs.Zip类的一些代码示例,展示了Zip类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
我正在使用 hibernate 4.0.0.CR4 并尝试使用 Java Persistence with Hibernate 中的“消息”示例。我能够使用 ant build 编译和运行应用程序,但
我已经为此苦苦挣扎了一天半左右。我正在尝试在 Gradle 中复制以下 Ant 概念: ... params="" /> ... 在哪里 runexe在别处声明为
今天在编写 Ant 脚本时,我注意到即使我的类路径是使用 classpath 属性定义的,启动 ant 时我仍然需要使用 -lib (即 ant -lib myjar .jar) 使其正常运行。
我使用说明 here 创建了自己的 ant 任务.在我的 ant 脚本中,我创建了 像这样: 然后我可以导入将其作为 ant 任务调用的脚本: 一切正常。现在,我希望在 tas
我试图在 ant 中为 Tomcat 定义一个 taskdef。 但是当我运行脚本时,出现错误: taskdef class org.apache.catalina.ant.StartTask c
我正在尝试运行使用 Java + Selenium + TestNG + Ant 构建的 Selenium 测试。但是,当我运行 build.xml 时会抛出以下错误 - BUILD FAILED G
当使用 taskdef 声明外部 ant 任务时,例如 ant-contrib,建议的设置是使用以下 taskdef: 当 antcontrib.properties 位于相
我有一个指向一个类的taskdef 在这里面我想传递java系统属性。就像我们在java任务中所做的那样 问题是 jar 是一些我无法修改的库。我无法使用命令在我们拥有的构建环境中进行设置。
我正在开发一个 eclipse 插件,它将以编程方式运行 Ant XML 文件。 我用了org.apache.tools.ant.helper.ProjectHelperImpl和 org.apach
我是一名优秀的程序员,十分优秀!