8

我正在尝试摆弄Foursquare 的 HeapAudit,并尝试使用 IntelliJ IDEA 进行设置。使用 pom.xml 中的依赖项,我设法让它构建得很好。

但是,当我实际尝试运行 JUnit 测试时,基本上它们都失败了。我猜这是因为使用 HeapAudit 需要 JVM 以它作为启动-javaagent,根据 github:

$ java -javaagent:heapaudit.jar MyTest

如果我把这条线放进去,并且引用了heapaudit.jar我之前下载/构建的,大概测试会通过。但是,在我看来,如果我更改源代码,我将需要重新打包这个愚蠢的 .jar 文件以查看它是否有效。

有没有什么方法可以在-javaagent每个测试周期都通过 compile -> package-into-jar 来运行测试?也许让 IntelliJ在运行测试之前附加新编译的.class文件?-javaagent

4

1 回答 1

5

1)有一个罐子只有一个META-INF/MANIFEST.MF

清单必须正确配置Premain-Class和其他属性。jar 不需要任何其他文件。将此罐与-javaagent. 只要代理类在类路径中,代理就会正常启动。

使用maven-surefire-pluginwith时可能会失败,forkMode=never因为默认情况下应用程序类加载到子 ClassLoader 中。

适用于 Eclipse 和 Intellij。

如果这样做,请仔细检查清单语法(曾经我花了很长时间才发现包名是错误的)。

2) 使用ea-agent-loader

它将允许您在运行时加载代理(任何代理)(它使用VM.attach())。但是,VM.attach()有时会中断调试并且断点可能无法触发。

与 forkMode=never 中的万无一失也会有同样的问题

3)在运行时加载代理。

编写代码以在运行时加载代理。并从你的调用它@BeforeClass你仍然需要一个 jar(如果你愿意,你可以在运行时生成它)。

只需要调用它(仅一次):

AgentLoader.loadAgentClass(YourAgentClass.class.getName());
于 2015-05-08T02:39:37.513 回答