java - 在 Maven 构建期间,第二个主类覆盖第一个主类

标签 java maven pom.xml

我仍在开发一个包含两个主要类的 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

不支持多个主类,甚至不存在多个主类的概念。

您的选择是:

  1. 将项目分为 3 部分:
    • 常见的东西
    • 主要 1 类内容
    • 主要 2 类内容
  2. 使用 1 个主类构建,但动态调用第二个主类 java -cp myjar.jar my.other.MainClass 因为两者的命令已经不同

关于java - 在 Maven 构建期间,第二个主类覆盖第一个主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540700/

相关文章:

java - 由于依赖项和/或插件而导致 pom.xml 文件错误

java - 将我的本地maven存储库同步到Nexus公共(public)存储库

java - Apache 电子邮件 validator 的错误

maven - 开发者 :watch does not reload bundles on JBoss Fuse 6. 3.0

java - 为什么我的 Javassist 类没有在运行时执行?

java - {project.parent.basedir} 采用子模块路径而不是父模块路径

java - Spring Boot Rest 在注册时设置用户默认配置文件图像

java - 如何增加 if 语句中的变量以便在另一个语句中使用?

java - Maven 和 Eclipse : loading default properties in maven library project and use it in runnable Jar

java - 编译程序集:single error