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)
在我的情况下,我使用的是 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/ 等。
| 归档时间: |
|
| 查看次数: |
9422 次 |
| 最近记录: |