在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没有找到,因为它无法读取新的Sping Boot Uber jar结构
我的问题是-在Sping Boot Maven Plugin的新版本中,是否有可能让它生成与1.3.9.RELEASE版本相同的结构的uber jar?
我尝试了maven-shade-plugin -但这会导致其他问题
任何帮助都非常感谢
谢谢达米恩
6条答案
按热度按时间q5iwbnjs1#
解决方案是在pom.xml文件中为插件添加MODBLE布局
字符串
7d7tgy0s2#
在我的情况下,我使用的是spring Boot 2.X,我在
maven-dependency-plugin
之后声明了spring-boot-maven-plugin
(我用来解包并在Docker中创建分解的应用程序),它必须在解包之前,这是有意义的,它在spring Boot maven插件执行之前解包。下次我会在插件链中首先声明它,在这上面浪费了1个多小时。希望它能帮助到别人。字符串
8wtpewkr3#
上面的答案与
字符串
不再工作,这是因为 layout 元素在Sping Boot 2.x中被弃用。我正在使用Sping Boot 2.0.x,我在github上发现了这个有用的评论:
对模块布局的支持在Sping Boot 2.0中被删除,而在1.5中被弃用。不幸的是,Maven插件的文档更新被遗漏了,所以我们可以利用这个问题来解决这个问题。你应该使用自定义的LayoutFactory。
但由于我不想实现LayoutFactory,我尝试了下面的第二个解决方案,实际上重新打包并创建了一个额外的jar,并给出了一个分类器名称:
这是由于Sping Boot 1.4中可执行jar的布局发生了变化。Application classes现在打包在BOOT-INF/classes中。您的客户端模块依赖于重新打包的web模块的fat jar。由于新的布局,这意味着客户端模块无法再加载web模块的classes。如果您想使用web模块作为依赖项,您应该配置 Boot 的重新打包以将分类器应用于fat jar。例如:
型
这样做将允许其他模块依赖于原始jar,而原始jar没有嵌入模块的依赖项,并且在jar的根目录中有类。
一个原始的jar有相同的结构,因为我想像
型
第二类分类器采用了较新的结构,如BOOT-INF/等。
wlzqhblo4#
对我来说,这个解决方案有点阴险.
讨厌的事情是,当我运行mvn spring-boot:run时,spring boot运行得很好,并且运行app!直到我们试图部署到PCF(作为spring-boot apps),我们才得到一个错误,即二进制文件的格式有问题。
字符串
一旦我从POM中删除了pluginManagement标签,我现在将获得./BOOT-INF结构。请记住,pluginManagement通常用于parent-pom结构,您希望该插件的配置在其他模块中使用。
m4pnthwp5#
我们如何使用gradle实现相同的结果?我已经从spring-boot-gradle-plugin 1.2.5切换到1.4.0,现在jar结构已经改变。这个解决方案
<layout>MODULE</layout>
在gradle中有等效的吗?roejwanj6#
我用的是Gradle而不是Maven,这是我必须做的:
1-在我的build.gradle中,我添加了以下在https://spring.io/guides/gs/spring-boot-Docker/中定义的属性。
字符串
2-我的依赖文件夹没有被写入
型
相反,我将其定位在另一个文件夹中,因此我在Dockerfile中更改了此属性:
型
通过这种方式,我获得了成功。