java—在从命令行运行jar时重写pom.xml中指定的主类

frebpwbc  于 2021-06-24  发布在  Storm
关注(0)|答案(2)|浏览(415)

在maven项目中,我有两个类,其中包含主方法(不是SpringBoot)类a和类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中指定了默认的主类,如下所示:

<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 在命令行中,主方法按预期执行。我使用的命令如下:

java -jar myExample-Snapshot.jar

它按预期运行类a,因为我在下面指定了它 <mainClass>com.example.A</mainClass> 在我的pom.xml中。
现在我想具体说明一下 class A 或者 class B 当我从命令行执行jar时。我试过以下方法,

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

但是它使用 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 作为命令行参数)
可行吗?或者我应该换一种方式

xienkqul

xienkqul1#

用-jar参数启动java将导致java查看manifest.mf文件(包含在jar中),其中指示要执行的主类。显然,maven安装程序会相应地为您创建这个manifest.mf。
用-cp启动java只表示java应该在哪个jar中查找所需的类。开始行上的第一个非限定参数表示执行main()方法的主类。所有其他参数都作为args[]传递给main方法。

ia2d9nvy

ia2d9nvy2#

这是我的pom和shade插件,所以我得到了一个可运行的分解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>

现在我有两个主要课程:

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

现在我得到了一个分解的jar,但是我没有将其作为jar运行,而是将jar添加到类路径中运行main:

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

这就是主类的清单

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

相关问题