用 exec.mainClass 覆盖 exec-maven-plugin

Posted

技术标签:

【中文标题】用 exec.mainClass 覆盖 exec-maven-plugin【英文标题】:Overriding exec-maven-plugin with exec.mainClass 【发布时间】:2021-03-31 17:46:22 【问题描述】:

我已经启动了一个新的maven项目并配置了exec-maven-plugin以设置默认mainClass,我可以使用执行

mvn exec:java -q
Hello World!

但是,如果我尝试在命令行上指定不同的 mainClass,这似乎会被忽略:

mvn exec:java -Dexec.mainClass="com.jamesmcguigan.kdt.App2" -q
Hello World!

如果我从 pom.xml 中注释掉 exec-maven-plugin 部分,则上述行有效,但最好在 pom.xml 中为 maven exec:java 设置默认值,并有一种方法可以在 cli 上覆盖它为mvn exec:java -Dexec.mainClass="com.jamesmcguigan.kdt.App2"

还是我在这里遗漏了什么?

文件

pom.xml

  <build>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.jamesmcguigan.kdt.App</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

src/main/java/com/jamesmcguigan/kdt/App.java

package com.jamesmcguigan.kdt;
public class App 

    public static void main( String[] args )
    
        System.out.println( "Hello World!" );
    

src/main/java/com/jamesmcguigan/kdt/App2.java

package com.jamesmcguigan.kdt;
public class App2 

    public static void main( String[] args )
    
        System.out.println( "Hello World 2!" );
    

【问题讨论】:

【参考方案1】:

使用一个属性,即:

<properties>
        ...
        <main.class>com.jamesmcguigan.kdt.App</main.class>
</properties>
...
<configuration>
         <mainClass>$main.class</mainClass>
</configuration>

然后: mvn exec:java -Dmain.class="com.jamesmcguigan.kdt.App2" -q

【讨论】:

谢谢,这行得通。也可以使用&lt;exec.mainClass&gt; 作为向后兼容的变量名。并提醒自己:遇到ClassNotFoundError时不要忘记使用mvn compile exec:java 这是 Maven Exec 插件的错误吗? -Dexec.mainClass 属性应该按照mojohaus.org/exec-maven-plugin/java-mojo.html 工作。与 1.6.0 和 3.0.0 的行为相同。似乎 pom.xml 中的插件配置覆盖了不应发生的命令行属性。

以上是关于用 exec.mainClass 覆盖 exec-maven-plugin的主要内容,如果未能解决你的问题,请参考以下文章

Maven 命令 mvn 从终端运行没有错误,但从 python 运行没有错误

管道似乎无法在 exec() 覆盖的 fork() 进程之间进行通信

python基础之 运行程序(reload import exec)

jacoco.exec文件是干啥

import与exec执行文件的异同

javacoco多次dump的exec会累加么