【问题标题】:How can I build two repackaged jars with Spring Boot如何使用 Spring Boot 构建两个重新打包的 jar
【发布时间】:2017-01-16 05:19:33
【问题描述】:

我正在尝试让 spring-boot-maven-plugin 为两个不同的主类构建两个重新打包的 jar。我在配置块中添加了两个带有特定 mainClass 参数的执行块,但插件似乎不尊重它,因为配置块位于执行块内而不是插件级别,我总是得到 ​​p>

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]

这里是 pom 的 maven-spring-boot-maven 插件的插件部分。

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

对此的任何帮助都会很棒。我在 maven-plugin 的 stackoverflow 上看到了配方,但这些不适用于 spring-boot。

【问题讨论】:

    标签: java spring maven spring-boot pom.xml


    【解决方案1】:

    您可以使用&lt;classifier&gt; 执行此操作。示例:

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

    【讨论】:

    • 这看起来很有趣,但缺少上下文。请问是什么在控制分类器?
    • 这解决了我的问题。我不想使用配置文件进行构建,因为这意味着为 monorepo 更改共享微服务 CI 工作。在我的例子中,我将一个执行的分类器设置为 `lock` 用于锁好的 jar,以及 `unlock` 用于解锁的姊妹工具。然后我得到两个罐子。./target/my-tool-2.14.7-RELEASE-lock.jar./target/my-tool-2.14.7-RELEASE-unlock.jar。所以看起来你的分类器是你想要的任何东西作为唯一标识符。
    【解决方案2】:

    我无法让它在一个构建中同时工作(我并不是说不可能),但是一种选择是定义 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.jartwo.jar

    【讨论】:

      【解决方案3】:

      假设它是可行的,按照您的要求进行操作意味着除了清单的 main-class 属性之外,生成的 2 个 jar 将是相同的。 我宁愿建议你打包一个jar并使用spring配置文件来启动它

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

      这允许您定义 2 个application-${profile}.properties 和 @Conditional 配置类,所有这些都基于配置文件名称。

      【讨论】:

        【解决方案4】:

        看来您必须首先考虑 执行 没有 id 和另一个 执行s 有 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>
        

        【讨论】:

          猜你喜欢
          • 2020-03-24
          • 2019-07-05
          • 2022-06-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 2020-11-06
          • 2021-02-27
          • 1970-01-01
          相关资源
          最近更新 更多