保留ant的java任务调用之间的静态字段

时间:2011-08-05 14:15:16

标签: java ant classloader

以下是这种情况:我尝试制作一个执行以下操作的ant测试脚本 1 - 运行实用程序以创建测试数据 2 - 运行junit套房 3 - 运行实用程序以清理测试数据。

问题是第2部分和第2部分。 3需要访问1中的实用程序的一些静态字段(例如,生成测试数据的唯一名称)。我遇到的这个问题是,当我尝试访问它们时,类的静态字段为null,就好像#1中的java任务是在单独的进程中运行或使用不同的类加载器一样(我尝试过设置属性)在java任务上使用fork =“false”并在cmd行上使用-Dant.reuse.loader = true。任何蚂蚁大师都知道这里发生了什么?

1 个答案:

答案 0 :(得分:0)

由于您正在处理不同的类加载器,因此您永远不会通过一个类加载器找到完全相同类的“错误”实例,因此使用“错误”的静态值。您需要通过文件在ant调用之间进行通信。临时文件可能不会,因为它可能会在第二组ant类有机会使用它之前被删除。

有两个问题,即生成合适的属性值,以及在ant调用之间传输它们。也许您不需要所有这些,因为您的情况可能已经生成了合适的标识符,但是如果您这样做的话就在这里。

要生成合适的值,一个ant进程应该使propertyfile任务生成适当的名称,并将每次运行的更改标识符作为名称的一部分

<propertyfile file="testConfig.properties.ids" comment="Machine generated file, do not edit!">
  <entry key="test.suite.1.id" type="int" operation="+" unit="1"/>
  <entry key="test.suite.2.id" type="int" operation="+" unit="1"/>
</propertyfile>
<properties file="testConfig.properties.ids"/>
<propertyfile file="testConfig.properties" comment="Machine generated file, do not edit!">
  <entry key="test.suite.1.name" type="string" operation="=" value="TestSuite${test.suite.1.id}.sh"/>
  <entry key="test.suite.2.name" type="string" operation="=" value="TestSuite${test.suite.2.id}.sh"/>
</propertyfile>

然后,后续的ant进程只能在原始ant进程生成的属性文件中获取。

<property file="testConfig.properties"/>

这将具有定义

的效果
test.suite.1.name=TestSuite34.sh
test.suite.2.name=TestSuite83.sh