繁体   English   中英

如何从我自己的Maven库中修改一个项目的Maven测试执行阶段的命令行arguments?

[英]How to modify the command line arguments of the Maven test execution phase of a project from my own Maven library?

I'd like to create a Maven library which will be a helper tool for testing so it will only be used during the testing phase, just like Hamcrest , AssertJ etc. This library needs a Java agent to properly function and this Java agent needs to在启动时而不是在运行时加载(所以通过命令行选项-javaagent )?

因此,假设有一个(第三方)应用程序使用我的 Maven 库,如下所示:

 <dependency>
    <groupId>my.org</groupId>
    <artifactId>my.library</artifactId>
    <version>1.0</version>
    <scope>test</scope>
 </dependency>

在我的库中,我的代理将打包在jar中,但也会有一些其他代码来帮助加载代理。 因此,当在第三方应用程序中运行测试时,我的库中的 Java 代理应该会自动加载,无需任何用户干预(因此唯一必要的步骤是将我的库添加为依赖项)。

如何在加载时加载此代理? 可能吗? 如果使用简单的 Maven 库无法实现,那么我是否可以创建一个 Maven 插件(因此第三方应用程序在pom.xml中包含我的插件)?

我之所以要在加载时而不是运行时加载代理是因为在Java 9之后,需要在命令行中添加-Djdk.attach.allowAttachSelf=true以允许在运行时加载代理,所以为什么如果我可以添加-javaagent ,请添加该参数

你不能。 想象一下,如果没有用户的知识并且除了添加您的依赖项之外没有任何其他操作,您将转换她的应用程序字节码,那么安全隐患!

添加依赖是一回事,通过调用方法或启动 Java 代理来激活它是另一回事。 这应该在客户端应用程序的控制之下。 可以在运行时附加 Java 代理而不使用-javaagent: ,但客户端应用程序必须通过调用代理提供程序中的初始化方法来显式执行此操作。 如果该合同在您和您的用户之间成立,即如果用户通过调用该假设的初始化方法进行合作(在您要修改的类加载之前足够早),您可以这样做。

有什么大不了的? 您想为您的用户提供代理功能。 为什么他们不能像往常一样启动代理? 向 JVM 命令行添加参数是否如此努力?


Update after the OP also edited the question: For Maven Surefire (unit tests) or its twin Maven Failsafe (integration tests), you want to use the argLine parameter in order to start the target JVM with the Java agent on the command line. 例如,请在此处查看我的回答 它是关于在命令行上使用 AspectJ 织入代理开始测试,但原理是相同的。 基本上,它是这样的:

<properties>
  <myDependency.version>1.2.3</myDependency.version>
</properties>

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.9</version>
  <configuration>
    <argLine>
      -javaagent:${settings.localRepository}/my/group-id/my-dependency/${myDependency.version}/my-dependency-${myDependency.version}.jar
    </argLine>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>my.group-id</groupId>
      <artifactId>my-dependency</artifactId>
      <version>${myDependency.version}</version>
    </dependency>
  </dependencies>
</plugin>

您只需要记录如何使用您的测试代理,以便您的所有下游用户都知道它。

如果您不想半手动指定代理的路径,您可以使用 Maven 依赖插件的dependency:properties目标,以便自动生成所有依赖项,包含路径名。 但这不是必需的,只是锦上添花。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM