从命令行覆盖 pom.xml 中指定的主要 class 而 运行 jar

Override main class specified in pom.xml while running jar from command line

我在 Maven 项目中有 2 个 class 主要方法。(不是 SPRING BOOT) class A 和 class B

class A{
    public static void main(String[] args){ 
        System.out.println("CLASS A");
   }
}

class B{
    public static void main(String[] args){ 
        System.out.println("CLASS B");
   }
}

并且我在 pom 中指定了默认的 main class 如下:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <transformers>
                    <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.A</mainClass>
                    </transformer>
                </transformers>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

现在,当我 运行 从命令行使用 java -jar 项目时,主要方法 A 按预期执行。我使用的命令如下:

java -jar myExample-Snapshot.jar

它 运行 是预期的 class A,因为我在 pom.xml.

中的 <mainClass>com.example.A</mainClass> 下指定了它

现在我想在从命令行执行 jar 时指定 class Aclass B。我尝试了以下,

java -jar myExample-Snapshot.jar com.example.B

但是它 运行 class A(在 pom 中指定)以 com.example.B 作为命令行参数(存储在 String[] args

然后我尝试将 main class B 添加到我的 pom 中,如下所示:

<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.A</mainClass>
                        <mainClass>com.example.B</mainClass> 
                    </transformer>

命令:java -jar myExample-Snapshot.jar com.example.A

但这次运行主要来自class B并完全忽略class A。(同样, com.example.A被用作命令行参数)

可行吗?或者我应该采取不同的方法。?

这是我的带有 shade 插件的 pom,所以我得到了一个 运行nable exploded jar,但没有 main 方法。

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

现在我有 2 个主要 classes:

public class App1 {
    public static void main(String[] args) {
        System.out.println("Hello World! App 1");
    }
}

现在我得到了一个爆炸的罐子,但我 运行 我的主要罐子已添加到 class 路径,而不是 运行 将它作为一个罐子:

greg@greg-XPS-13-9360:~/work/double-main$ java -cp target/double-main-1.0-SNAPSHOT.jar com.essexboy.App1
Hello World! App 1
greg@greg-XPS-13-9360:~/work/double-main$ java -cp target/double-main-1.0-SNAPSHOT.jar com.essexboy.App2
Hello World! App 2

这是带有主 class

的清单的样子
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: greg
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_201
Main-Class: com.essexboy.App1

使用 -jar 参数启动 java 将导致 java 查看 manifest.mf 文件(包含在 jar 中),主要 class 将在其中执行表示。显然,您的 Maven 设置会相应地为您创建此 manifest.mf。

以 -cp 开始 java 仅指示在哪个 jar(s) java 中查找需要的 classes。起始行的第一个非限定参数表示执行其 main() 方法的 main class。所有其他参数都作为 args[].

传递给 main 方法