pom.xml,用于具有多个主类的单个jar



我有一个Java项目,其中有多个使用相同类的可执行文件。我目前已经设置了maven install,为每个主类创建一个独立的可执行jar,其中包含所有依赖项。相反,我想把它放在一个罐子里,因为有大量的重复使用。当我之前尝试这样做时,我收到了关于缺少清单文件的投诉,所以我尝试了这种方法。

我需要如何设置pom.xml,然后如何指定在命令行上用java启动时使用哪个主类?

理想情况下,jar的用户只能指定明确允许的主类,因为我有一些测试主类,我不希望它们能够使用。

另一个可行的解决方案是将所有类都包含在一个不可执行的jar中,然后有一堆可执行的jar,每个jar都有一个指定的主类,但它们都可以访问不可执行jar。

pom.xml的相关部分如下所示:

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>build-a</id>
<configuration>
<archive>
<manifest>
<mainClass>path.to.MainClassA</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>MainClassA</finalName>
</configuration>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
<execution>
<id>build-b</id>
<configuration>
<archive>
<manifest>
<mainClass>path.to.MainClassB</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>MainClassB</finalName>
</configuration>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

我需要如何设置pom.xml,然后如何指定在命令行上用java启动时使用哪个主类?

本质上,不能在一个jar文件中声明多个主类。主类是在jar中META-INF/MANIFEST.MF文件的Main-Class属性中声明的,这就是JVM在运行java -jar my-main.jar时要查找的内容(无论使用的是什么构建工具(。

但是,在任何时候,当您启动java可执行文件时,您都可以显式指定您的主类,您只需要确保将包含它的jar文件放在类路径中(不需要-jar(。你甚至不需要任何特立独行的魔法就能做到这一点。因此,如果你从上面的pom中删除manifest/mainClass声明,并且只有一个maven汇编插件的执行,并且构建你的项目,你可以用不同的主类运行它,比如

java -cp target/my-main.jar path.to.MainClassA

java -cp target/my-main.jar path.to.MainClassB

最新更新