从命令行覆盖 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 A
或 class 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 方法
我在 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 A
或 class 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 方法