2012-06-18 31 views
28

我想在一个简单的两模块项目运行exec-maven-pluginexec:java目标,其中一个模块依赖于其他的java目标。到目前为止,我无法找到一个合适的配置。这里有一个煮向下测试案例:Maven的EXEC:在一个多模块项目

  • 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然后或者运行从module2的目录exec:java或使用-pl标志顶端。但是,我想避免运行mvn install。为了在多模块项目中运行此目标,不需要修改我的本地存储库。就像mvn compile“仅适用于”多模块项目一样,其他目标/阶段也应如此。

回答

23

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

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

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

不过,我认为这是更直观的改变目录运行它之前包含可执行的子模块。

+5

这(和'cd'ing子模块)假如你已经运行从顶部'MVN install'工作。否则,它会失败,因为它无法在任何存储库中找到“module1”。 'mvn compile'成功解析了模块,即使它们没有安装在本地仓库中。我正在寻找一种方法来使用'mvn exec:java'来获得这种行为。 –

+0

对不起,我在问题中加了一个说明。 –

+0

我不认为有可能在没有安装的情况下运行exec:java,除非maven reactor被调用。复杂的问题是,从父POM运行时,没有依赖关系,因此exec:java无法找到主类(更不用说依赖关系)。并且,当从子模块运行时,父/兄弟分辨率不会不会发生。我尝试了许多想法,但只有那个工作的人是@Raghuram的答案,以实现生命周期目标。 – kaliatech

8
  • 您应该将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> 
+0

我通过了验证。凉!仅在运行exec:java时才使用特殊配置文件来配置此目标会更清洁吗?否则,将对通过验证生命周期的任何活动调用exec。 – kaliatech

+0

@kaliatech。是的,基于要求。 – Raghuram

+1

@Raghuram - 我试过这个解决方案,它对于运行验证阶段非常有用。然而,当我尝试运行'mvn exec:java'时,maven会抛出一个异常,告诉我父项目缺少参数'mainClass'(而不是仅仅为子项目寻找主类)。任何想法我做错了什么? – Tiddo