Maven exec:多目标Java的目标

我试图在一个简单的双模块项目上运行exec-maven-pluginexec:java目标,其中一个模块依赖于另一个模块。 到目前为止,我找不到可用的配置。 这是一个简化的测试用例:

  • EXEC-多模块检验/
  • 的pom.xml
  • 模块1 /
  • 的pom.xml
  • SRC /
  • 主要/
  • 的Java /
  • HelloPrinter.java
  • 模块2 /
  • 的pom.xml
  • SRC /
  • 主要/
  • 的Java /
  • MyMain.java
  • 这是父pom:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.mkscrg.sandbox</groupId>
        <artifactId>exec-multi-module-test</artifactId>
        <version>1.0</version>
        <packaging>pom</packaging>
    
        <modules>
            <module>module1</module>
            <module>module2</module>
        </modules>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2.1</version>
                </plugin>
            </plugins>
        </build>
    </project>
    

    module1的pom:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <artifactId>exec-multi-module-test</artifactId>
            <groupId>com.mkscrg.sandbox</groupId>
            <version>1.0</version>
        </parent>
    
        <artifactId>module1</artifactId>
    </project>
    

    module2的pom:http://maven.apache.org/xsd/maven-4.0.0.xsd“> 4.0.0

        <parent>
            <artifactId>exec-multi-module-test</artifactId>
            <groupId>com.mkscrg.sandbox</groupId>
            <version>1.0</version>
        </parent>
    
        <artifactId>module2</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.mkscrg.sandbox</groupId>
                <artifactId>module1</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </project>
    

    该项目从顶部成功编译,但运行mvn exec:java -Dexec.mainClass=myMain失败:

    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Build Order:
    [INFO] 
    [INFO] exec-multi-module-test
    [INFO] module1
    [INFO] module2
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building exec-multi-module-test 1.0
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test >>>
    [INFO] 
    [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test <<<
    [INFO] 
    [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test ---
    [WARNING] 
    java.lang.ClassNotFoundException: MyMain
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
            at java.lang.Thread.run(Thread.java:680)
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] 
    [INFO] exec-multi-module-test ............................ FAILURE [0.363s]
    [INFO] module1 ........................................... SKIPPED
    [INFO] module2 ........................................... SKIPPED
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.566s
    [INFO] Finished at: Mon Jun 18 14:11:54 PDT 2012
    [INFO] Final Memory: 3M/81M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project exec-multi-module-test: An exception occured while executing the Java class. MyMain -> [Help 1]
    [ERROR] 
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR] 
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    

    什么是正确的方式来配置这个项目,以允许exec:java来看MyMain

    编辑:这是一个要点,如果你想自己尝试这个:https://gist.github.com/2950830

    编辑:澄清:我知道这是可能的mvn install ,然后要么运行exec:javamodule2的目录,或使用-pl从顶部标志。 但是,我想避免运行mvn install 。 为了在多模块项目中运行此目标,不需要修改我的本地存储库。 就像mvn compile对多模块项目“正常工作”一样,其他目标/阶段也应该如此。


    多模块项目中的目标(从父项目运行时)将针对所有模块运行。 我不认为这就是你想要的。 你可以试试:

    mvn exec:java -pl module2 -Dexec.mainClass=MyMain
    

    这可能有用吗? 更多信息:

  • 在多模块反应堆项目的子模块中从命令行运行特定的Maven插件目标
  • 但是,我认为在运行它之前将目录更改为包含可执行文件的子模块会更直观。


  • 你应该绑定exec-maven-plugin到一个maven生命周期的目标,说verify
  • 由于您只希望插件仅针对module 2执行,因此请在pluginManagement中的父pom中定义插件配置。 仅在module 2使用相同的内容。
  • 然后运行以下命令:
  • mvn verify -Dexec.mainClass=MyMain

    父母pom

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2.1</version>
                    <executions>
                     <execution>
                         <phase>verify</phase>
                         <goals>
                             <goal>java</goal>
                         </goals>
                     </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    

    模块2

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    在没有mvn install情况下查看单个命令选项的答案:

    https://stackoverflow.com/a/26448447/1235281

    通过在父pom.xml使用skip ,您可以告诉Maven只在特定的子模块上运行exec:java

    GitHub:https://github.com/Oduig/mavenfiddle

    链接地址: http://www.djcxy.com/p/37577.html

    上一篇: Maven exec:java goal on a multi

    下一篇: maven package doesn't compile