我仍在开发一个包含两个主要类的 Maven 项目。我现在使用配置文件和 Maven 程序集插件。我尝试过以下几种方法:
将两个主要类添加到一个 list
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>CombineMains</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>combineMains</finalName>
<archive>
<manifest>
<mainClass>com.fruit.Kiwi</mainClass>
<mainClass>com.vegetable.Carrot</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
将两个 list 添加到一个存档
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>CombineMains</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>combineMains</finalName>
<archive>
<manifest>
<mainClass>com.fruit.Kiwi</mainClass>
</manifest>
<manifest>
<mainClass>com.vegetable.Carrot</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
将两个文件添加到一个执行中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>CombineMains</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>combineMains</finalName>
<archive>
<manifest>
<mainClass>com.fruit.Kiwi</mainClass>
</manifest>
</archive>
<archive>
<manifest>
<mainClass>com.vegetable.Carrot</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
使用两种不同的执行
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>Main1</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>kiwi</finalName>
<archive>
<manifest>
<mainClass>com.fruit.Kiwi</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
<execution>
<id>Main2</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>carrot</finalName>
<archive>
<manifest>
<mainClass>com.vegetable.Carrot</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
不幸的是,这些解决方案不起作用。每个解决方案都会发生同样的情况。第二个 mainClass 覆盖第一个。我像这样构建 jar :
mvn clean package -DskipTests -P Kiwi -P Carrot
然后我像在配置文件之间切换一样运行 jar:
java -jar -Dspring.profiles.active=Kiwi target/hugeJar.jar
java -jar -Dspring.profiles.active=Carrot target/hugeJar.jar
我注意到,包含最后构建的主配置文件的配置文件是唯一正确运行的配置文件,而另一个配置文件无法运行。如果胡萝卜是最后 build 的,那么胡萝卜会运行,但猕猴桃不会。如果 kiwi 是最后 build 的,那么 kiwi 会运行,但胡萝卜不会。对我应该做什么有什么建议吗?
最佳答案
根据 doc ,一个可执行 jar 有一个主类,它在 list 中声明如下:
Main-Class: classname
不支持多个主类,甚至不存在多个主类的概念。
您的选择是:
- 将项目分为 3 部分:
- 常见的东西
- 主要 1 类内容
- 主要 2 类内容
- 使用 1 个主类构建,但动态调用第二个主类
java -cp myjar.jar my.other.MainClass
因为两者的命令已经不同
关于java - 在 Maven 构建期间,第二个主类覆盖第一个主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540700/