通过maven从测试类运行main方法

时间:2015-06-15 07:12:54

标签: maven maven-plugin

我的pom.xml中有以下内容:

<build>
   ...
   <plugins>
   ...
      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>1.2.1</version>
          <configuration>
              <mainClass>com.myorg.MyClass</mainClass>
          </configuration>
      </plugin>
   </plugins>
</build>

com.myorg.MyClass位于我的测试源目录中,我可以使用以下命令运行它:

mvn -e exec:java -Dexec.classpathScope="test"

我想:

  1. 避免使用-Dexec.classpathScope="test",但我无法弄清楚如何配置该插件在测试类路径中查看。
  2. 为其他类编写更多插件(每个类都有不同的配置),但是现在我只能运行exec:java。有没有办法标记这个插件,以便我通过该标签调用它,而不是只是说&#34;运行exec中的任何内容:java&#34;?
  3. 拉入-javaagent属性。我在我的pom.xml中定义了这个属性,测试用例正在使用它。我的&#34;定制&#34;插件获取这些属性还是我需要做任何事情来吸引它们?
  4. 这是属性,直接在<project>

    下定义
    <properties>
       <spring.version>3.2.6.RELEASE</spring.version>
       <atomikos.version>3.9.2</atomikos.version>
       <loadTimeWeaverArgLine>-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar"</loadTimeWeaverArgLine>
    </properties>
    

    尝试使用个人资料

    根据@Michal的建议(https://stackoverflow.com/a/30839824/257233),这就是我的尝试:

    <profile>
       <id>run-importer</id>
       <properties>
          <loadTimeWeaverArgLine>-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar"</loadTimeWeaverArgLine>
       </properties>
       <build>
          <plugins>
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                   <executable>java</executable>
                      <!--
                         None of these three options work.
                         <commandlineArgs>-javaagent:C:/Users/robbram/.m2/repository/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar</commandlineArgs>
                         <commandlineArgs>${loadTimeWeaverArgLine}</commandlineArgs>
                         <commandlineArgs>-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar"</commandlineArgs>
                         <argLine>${loadTimeWeaverArgLine}</argLine>
                      -->
                   <classpathScope>test</classpathScope>
                   <mainClass>com.myorg.MyClass</mainClass>
                </configuration>
             </plugin>
          </plugins>
       </build>
    </profile>
    

    我用:

    运行它
    mvn -e exec:java -Prun-importer 
    

    我使用以下任一选项获得以下异常:

    [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project TOLTAT-Model: An exception occured while executing the Java class. null: InvocationTargetException: Error creating bean with name 'loadTimeWeaver' defined in class org.springframework.context.annotation.LoadTimeWeavingConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.instrument.classloading.LoadTimeWeaver org.springframework.context.annotation.LoadTimeWeavingConfiguration.loadTimeWeaver()] threw exception; nested exception is java.lang.IllegalStateException: ClassLoader [java.net.URLClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project TOLTAT-Model: An exception occured while executing the Java class. null
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
       at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    

    我可以确认正在执行主类com.myorg.MyClass。我可以看到它的其他输出。我还可以确认loadTimeWeaverArgLine在本POM的其他部分有效。它已成功用于集成测试:

    <profile>
       <id>integration-tests</id>
       <build>
          <plugins>
             <!-- Integration tests require additional loadtime Spring argument -->
             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                   <forkMode>once</forkMode>
                   <argLine> ${loadTimeWeaverArgLine}</argLine>
                   <skip>false</skip>
                </configuration>
             </plugin>
          </plugins>
       </build>
    </profile>
    

    尝试使用profile和mvn exec:exec

    Upodate(2015年6月17日星期三,下午12:11:17):关注Michal's latest comment我现在按照自己的意愿工作:

    <profile>
       <id>run-importer</id>
       <properties>
          <loadTimeWeaverArg>-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6/spring-agent-2.5.6.jar"</loadTimeWeaverArg>
          <log4JConfigArg>-Dlog4j.configuration=file:${project.build.directory}/path/to/log4j.properties</log4JConfigArg>
          <mainClassArg>com.myorg.MyClass</mainClassArg>
          <arg1>foo</arg1>
       </properties>
       <build>
          <plugins>
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <goals>
                   <goal>exec</goal>
                </goals>
                <configuration>
                   <executable>java</executable>
                   <classpathScope>test</classpathScope>
                   <arguments>
                      <argument>${log4JConfigArg}</argument>
                      <argument>${loadTimeWeaverArg}</argument>
                      <argument>-classpath</argument>
                      <classpath />
                      <argument>${mainClassArg}</argument>
                      <argument>${arg1}</argument>
                   </arguments>
                </configuration>
             </plugin>
          </plugins>
       </build>
    </profile>
    

    我用它来运行:

    mvn -e exec:exec -Prun-importer
    

    这种方法的优点:

    • 此个人资料的目的是运行&#34;特殊代码&#34;永远不应该部署但需要在src和test src中使用代码。
      • 我注意到Michal的建议,这应该是一个单独的模块。如果这个代码库还没有那么完善(大,旧,复杂),我会认真考虑这个。
    • 它留下了空间,以防需要复制,因此没有&#34;竞争&#34;关于使用mvn -e exec:exec运行的内容。
    • 我可以使用pom中已存在的变量指定java agent,log4j和许多其他配置。
    • 我可以使用-Darg1="bar"
    • 在命令行上覆盖任何这些参数

1 个答案:

答案 0 :(得分:3)

我不确定你实际上要完成什么,因为它非常不习惯使用Maven。但是,所有这些东西在技术上都是可能的:

1 /

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <mainClass>com.myorg.MyClass</mainClass>
        <classpathScope>test</classpathScope>
    </configuration>
</plugin>

2 /

您可以使用配置文件并将不同的插件配置放在不同的配置文件中。然后你打电话:

mvn -e exec:java -Pmy-first-profile

但是,我觉得这很奇怪。我在这里的建议是重新考虑你的情况,并为此选择另一种方式或工具。

3 /

作者编辑后问题本身的最终解决方案。