在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
作为命令行参数)
可行吗?或者我应该换一种方式
2条答案
按热度按时间xienkqul1#
用-jar参数启动java将导致java查看manifest.mf文件(包含在jar中),其中指示要执行的主类。显然,maven安装程序会相应地为您创建这个manifest.mf。
用-cp启动java只表示java应该在哪个jar中查找所需的类。开始行上的第一个非限定参数表示执行main()方法的主类。所有其他参数都作为args[]传递给main方法。
ia2d9nvy2#
这是我的pom和shade插件,所以我得到了一个可运行的分解jar,但是没有main方法。
现在我有两个主要课程:
现在我得到了一个分解的jar,但是我没有将其作为jar运行,而是将jar添加到类路径中运行main:
这就是主类的清单