【问题标题】:Spring Boot Layered jar: Extract layers.xml to separate dependencySpring Boot分层jar:提取layers.xml以分离依赖
【发布时间】:2020-08-06 20:51:49
【问题描述】:

我开始了解spring-boot-maven-plugin 中重新打包目标的功能。看起来很有希望,但我需要对其进行一些微调。

我可以通过在我的项目中的某处创建一个layers.xml 文件来轻松做到这一点,但问题是我不仅有 1 个项目,而是有六个项目。所有项目都需要相同类型的分层,但我真的不想为每个要使用它的项目复制相同的配置。

一个漂亮的解决方案是将该配置文件提取到一个单独的 jar 中,并让插件从那里获取配置文件,但我看不出有什么办法。是否有任何其他解决方案不涉及我将配置文件复制到我拥有的每个项目?

不幸的是,即使我拥有的项目使用相同的父项目,但不在同一个多模块项目中。

【问题讨论】:

    标签: java spring spring-boot spring-boot-maven-plugin


    【解决方案1】:

    我想出了一个解决办法。

    在问这个问题之前,我的 spring-boot-mave-plugin 配置看起来像这样:

                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <layers>
                            <enabled>true</enabled>
                        </layers>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <layers>
                                    <enabled>true</enabled>
                                    <configuration><!-- something like classpath:layers.xml --></configuration>
                                </layers>
                                <classifier>exec</classifier>
                            </configuration>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>artifact</groupId>
                            <artifactId>with-layers.xml</artifactId>
                            <version>...</version>
                        </dependency>
                    </dependencies>
                </plugin>
    
    

    通过引入maven-dependency-plugin,解决方案变得更加复杂,它会下载前面提到的依赖项并将其解压缩到具有此配置的构建文件夹中:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>3.1.1</version>
                    <executions>
                        <execution>
                            <id>copy-shc-build-tools</id>
                            <goals>
                                <goal>unpack</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>artifact</groupId>
                                        <artifactId>with-layers.xml</artifactId>
                                        <version>...</version>
                                        <type>jar</type>
                                        <outputDirectory>${project.build.directory}</outputDirectory>
                                        <includes>**/layers.xml</includes>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                    </executions>
                    <configuration>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </plugin>
    
    

    反过来,&lt;configuration&gt;&lt;!-- something like classpath:layers.xml --&gt;&lt;/configuration&gt; 变为 &lt;configuration&gt;${project.build.directory}/layers/layers.xml&lt;/configuration&gt;

    【讨论】:

      【解决方案2】:

      Spring Boot Maven Plugin 的文档指出您可以手动设置layers.xml 的路径,那么为什么不让所有pom.xml 指向同一个位置呢?

      <project>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <version>2.3.2.RELEASE</version>
                      <configuration>
                          <layers>
                              <enabled>true</enabled>
                              <configuration>${project.basedir}/../layers.xml</configuration>
                          </layers>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
      

      /../ 表示比项目目录高一级。所以假设你在一个目录中有一堆项目,把layers.xml 放在那里,它会工作的。

      另一种方法是通过将 Maven 插件声明移动到所谓的parent POM 来重用它。这是一种将一系列项目的 POM 文件的公共/共享部分移动到单个 POM 文件(父 POM)的技术。 Here's an example

      【讨论】:

      • 我对多模块 maven 项目非常有经验,但不幸的是,我正在从事的项目不是一个大型的多模块 maven 项目,而是很多单个项目
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2015-12-12
      • 2020-07-08
      • 2019-07-26
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多