Я пытаюсь получить Spring-boot-maven-plugin для создания двух переупакованных jar-файлов для двух разных основных классов. Я добавил два исполнительных блока с их конкретным параметром mainClass в блок конфигурации, но кажется, что плагин не уважает его, потому что блок конфигурации находится внутри блока выполнения, а не на уровне плагина, и я всегда получаю

Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.3.0.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.mystuff.tools.b4commandline.Application, com.mystuff.tools.loadtester.Application]

Вот раздел плагинов плагина maven-spring-boot-maven файла pom.

<plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>${artifactId}</id>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mystuff.tools.loadtester.Application</mainClass>
                        <finalName>${artifactId}</finalName>
                    </configuration>
                </execution>
                <execution>
                    <id>b4-commandline</id>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mystuff.tools.b4commandline.Application</mainClass>
                        <finalName>b4-commandline</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Любая помощь по этому поводу была бы замечательной. Я видел рецепты stackoverflow для maven-plugin, но они не относятся к Spring-boot.

2
Marc Elser 8 Сен 2016 в 13:09

4 ответа

Лучший ответ

Я не мог заставить его работать в одной сборке (хотя я не говорю, что это невозможно), однако один из вариантов - определить 2 профиля maven :

<profiles>
    <profile>
        <id>one</id>
        <activation>
            <property>
                <name>one</name>
            </property>
        </activation>

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <mainClass>com.xyz.LauncherOne</mainClass>
                                <finalName>one</finalName>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

    </profile>

    <profile>
        <id>two</id>
        <activation>
            <property>
                <name>two</name>
            </property>
        </activation>

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <mainClass>com.xyz.LauncherTwo</mainClass>
                                <finalName>two</finalName>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Затем создайте его дважды , используя оба профиля (активированные с помощью свойства в моем примере кода):

$ mvn -Done clean install
$ mvn -Dtwo clean install

Он создает: one.jar и two.jar

1
alexbt 8 Сен 2016 в 12:27

Похоже, вы должны рассмотреть первое выполнение без id и еще одно выполнение с мне бы; Тогда это работает. для меня ниже работает нормально:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <!--<id>Batch 1(Don't put this one)</id>-->
                    <phase>package</phase>
                    <configuration>
                        <classifier>1</classifier>
                        <finalName>Core</finalName>
                        <mainClass>com.mainclass1</mainClass>
                    </configuration>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
                <execution>
                    <id>Batch 2</id>
                    <phase>package</phase>
                    <configuration>
                        <classifier>2</classifier>
                        <finalName>BatchA</finalName>
                        <mainClass>com.mainclass2</mainClass>
                    </configuration>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
                <execution>
                    <id>Batch 3</id>
                    <phase>package</phase>
                    <configuration>
                        <classifier>3</classifier>
                        <finalName>BatchB</finalName>
                        <mainClass>com.mainclass3</mainClass>
                    </configuration>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>
0
SpongeBob 2 Дек 2019 в 12:46

Если предположить, что это выполнимо, выполнение того, о чем вы просите, будет означать, что две созданные банки будут идентичны, за исключением атрибута main-class их манифеста. Я бы посоветовал вам упаковать одну банку и использовать пружинные профили для ее запуска :

$ java -jar -Dspring.profiles.active=profile1 YourApp.jar
$ java -jar -Dspring.profiles.active=profile2 YourApp.jar

Это позволяет вам определять 2 класса конфигурации application-${profile}.properties и @Conditional, все на основе имени профиля.

1
alexbt 8 Сен 2016 в 12:28

Вы можете сделать это с помощью <classifier>. Пример:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.3.RELEASE</version>
                <executions>
                  <execution>
                    <id>Pack application 1</id>
                    <phase>package</phase>
                    <configuration>
                      <finalName>application</finalName>
                      <mainClass>com.test.Application1</mainClass>
                      <outputDirectory>target/application1</outputDirectory>
                      <classifier>1</classifier>
                    </configuration>
                    <goals>
                      <goal>repackage</goal>
                    </goals>
                  </execution>
                  <execution>
                    <id>Pack application 2</id>
                    <phase>package</phase>
                    <configuration>
                      <finalName>application</finalName>
                      <mainClass>com.test.Application2</mainClass>
                      <outputDirectory>target/application2</outputDirectory>
                      <classifier>2</classifier>
                    </configuration>
                    <goals>
                      <goal>repackage</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
1
Vladyslav Mykhalets 10 Июл 2018 в 16:02