【问题标题】:How to run Tests when developing javaagents?开发 javaagents 时如何运行测试?
【发布时间】:2012-10-19 18:30:59
【问题描述】:

我正在尝试使用 Foursquare's 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

【问题讨论】:

  • 您应该自动构建 configure an artifact 或使用快捷方式从模块输出中生成/更新 heapaudit.jar 文件。

标签: java junit intellij-idea jvm profiling


【解决方案1】:

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

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

maven-surefire-pluginforkMode=never 一起使用时可能会失败,因为默认情况下,应用程序类是在子类加载器中加载的。

适用于 Eclipse 和 Intellij。

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

2) 使用ea-agent-loader

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

在 forkMode=never 中肯定会有同样的问题

3) 在运行时加载代理。

将您的代码写入load the agent in runtime。并从您的@BeforeClass 调用它您仍然需要一个 jar(如果需要,可以在运行时生成)。

你只需要调用这个(只需要一次):

AgentLoader.loadAgentClass(YourAgentClass.class.getName());

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2023-03-26
    相关资源
    最近更新 更多