有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java第二个主类在maven构建期间覆盖第一个主类

我还在做一个maven项目,有两个主要类。我现在正在使用profiles和maven assembly插件。我试过以下方法:
将两个主要类添加到一个清单中

<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>


将两个清单添加到一个存档

<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>


不幸的是,这些解决方案不起作用。每个解决方案都会发生同样的情况。第二个main类覆盖第一个main类。我是这样做的:

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

我注意到的是,包含最后生成的主配置文件的配置文件是唯一一个正确运行的配置文件,而另一个配置文件没有运行。如果胡萝卜是最后建成的,胡萝卜会跑,但猕猴桃不会。如果猕猴桃是最后建成的,猕猴桃会跑,但胡萝卜不会。对我该怎么做有什么建议吗


共 (1) 个答案

  1. # 1 楼答案

    根据doc,一个可执行jar有一个主类,它在清单中声明如下:

    Main-Class: classname
    

    没有对多个主类的支持,甚至没有多个主类的概念

    你的选择是:

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