Spring Boot Maven插件 - 没有BOOT-INF目录

Dam*_*ien 5 java spring maven spring-boot spring-boot-maven-plugin

在spring-boot-maven-plugin的版本1.3.8.RELEASE和版本1.4.0.RELEASE之间 - 生成的包结构发生了变化(如果你提取uber jar文件)1.3.8.RELEASE com, lib,META-INF和org目录1.4.0.RELEASE有一个BOOT-INF,META-INF和org目录,基本上是从1.4.0.RELEASE开始 - 所有的类和库都在BOOT-INF目录中.因此 - 当您尝试在Amazon Lambda上运行Spring Boot项目时 - 它说有一个未找到的jar,因为它无法读取新的Spring Boot Uber jar结构

我的问题是 - 是否有可能在较新版本的Spring Boot Maven插件中生成uber jar,使其与版本1.3.9.RELEASE中的结构相同?

我尝试了maven-shade-plugin - 但这导致了其他问题

任何帮助是极大的赞赏

谢谢Damien

Dam*_*ien 13

解决方案是在pom.xml文件中添加插件的MODULE布局

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>MODULE</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

  • 为什么没有人将其标记为正确答案.当我升级弹簧靴时我遇到了类似的问题.被docs.Spring描述困惑.添加此部分有效.<configuration> <layout> MODULE </ layout> </ configuration> (2认同)
  • 它说,无法执行目标 org.springframework.boot:spring-boot-maven-plugin:2.1.2.RELEASE:repackage (repackage) on project businessunit-service-businessunit: Unable to parse configuration of mojo org.springframework.boot :spring-boot-maven-plugin:2.1.2.RELEASE:repackage: 无法将“MODULE”转换为枚举:没有枚举常量 org.springframework.boot.maven.RepackageMojo.LayoutType.MODULE -&gt; [帮助 1] (2认同)

lau*_*sas 9

在我的情况下,我使用的是 spring boot 2.X 并且我声明了spring-boot-maven-plugin之后maven-dependency-plugin(我曾经在 Docker 中解压并创建爆炸的应用程序)并且它必须在解包之前,这是有道理的,它是在 spring boot maven 之前解包的插件执行。下次我会在插件链中声明它的第一件事,在这上浪费了 1 个多小时。希望它可以帮助某人。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${spring.boot.mainClass}</mainClass>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${project.artifactId}</artifactId>
                                <version>${project.version}</version>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)


小智 5

上面的答案与

<layout>MODULE</layout>
Run Code Online (Sandbox Code Playgroud)

不再起作用,这是因为Spring Boot 2.x 中不推荐使用布局元素。我正在使用 Spring Boot 2.0.x,我在 github 上发现了这个有用的评论:

Spring Boot 2.0 中删除了对模块布局的支持,并在 1.5 中弃用。不幸的是,Maven 插件文档的更新被遗漏了,因此我们可以利用这个问题来解决这个问题。您应该改用自定义 LayoutFactory

但由于我不想实现 LayoutFactory,我尝试了下面的第二个解决方案,它实际上重新打包并创建一个带有给定名称的分类器的额外 jar:

这是由于 Spring Boot 1.4 中可执行 jar 的布局发生了变化。应用程序类现在打包在 BOOT-INF/classes 中。您的客户端模块取决于重新打包的 web 模块的 fat jar。由于新的布局,这意味着客户端模块无法再加载 Web 模块的类。如果您想使用 Web 模块作为依赖项,您应该配置 Boot 的重新打包以将分类器应用于 fat jar。例如:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

这样做将允许其他模块依赖于未嵌入模块依赖项的原始 jar,并且类位于 jar 的根目录中。

一个原始罐子的结构与我想要的相同

com.my-package.foo.bar
META-INF
Run Code Online (Sandbox Code Playgroud)

第二个分类器具有较新的结构,如 BOOT-INF/ 等。