Spring Boot Maven Plugin可以配置打包的内容,对包中的内容进行layers-分层。
jar or war 的分层
jar包含应用程序的类BOOT-INF/classes和依赖项和BOOT-INF/lib。
war包含了应用程序的类WEB-INF/classes、依赖关系WEB-INF/lib、WEB-INF/lib-provided。
Spring Boot Maven Plugin能够进一步分隔这些目录,以便可以将它们写入不同的层,比如需要从jar或war的内容中构建docker映像的时候,先知道能分层,对于构建映像以后在研究。
分层打包和常规的jar或war是相同的布局,但包括描述每个图层的附加元数据文件。
默认情况下,定义了以下层:
- dependencies对于其版本不包含的任何依赖项SNAPSHOT。
- spring-boot-loader 用于加载程序类。
- snapshot-dependencies对于其版本包含的任何依赖项SNAPSHOT。
- application 用于本地模块依赖性,应用程序类和资源。
如果一个模块依赖关系已经被安装到Maven的本地缓存中,但是它不是当前构建的一部分,那么它将被识别为常规依赖关系,通过查看当前构建中的所有模块来确定模块依赖性。
嘛的,官网这意思英文说起来要绕这么长,用咱们中文说就一句:分层可以一眼看到模块之间的依赖关系。
上面的四个层确定了部分应用程序更改时可以缓存先前的层的可能性。默认顺序为dependencies,spring-boot-loader,snapshot-dependencies,application。应该首先添加最不可能更改的内容,然后添加更可能更改的层。
重新打包,也就是repackage的包默认包含 layers.idx文件。要禁用layers的话,可以如下设置:
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layers><enabled>false</enabled></layers></configuration></plugin></plugins></build></project>
自定义layers层配置
可以使用一个单独的配置文件来调整图层的创建方式和添加新图层:
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layers><enabled>true</enabled><!--project.basedir不需要自己搞,默认就是你的项目路径--><configuration>${project.basedir}/src/layers.xml</configuration></layers></configuration></plugin></plugins></build></project>
接着按照定义的路径来创建layers.xml:
<layersxmlns="http://www.springframework.org/schema/boot/layers"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/boot/layershttps://www.springframework.org/schema/boot/layers/layers-2.5.xsd"><application><!--声明spring-boot-loader层的内容。--><intolayer="spring-boot-loader"><include>org/springframework/boot/loader/**</include></into><!-- 声明 application层的所有剩余类和资源。--><into layer="application" /></application><dependencies><!-- 声明的所有模块依赖项application.layer --><into layer="application"><includeModuleDependencies /></into><!-- 声明该snapshot-dependencies层的所有SNAPSHOT依赖项 --><into layer="snapshot-dependencies"><include>*:*:*SNAPSHOT</include></into><!-- 要求保留该dependencies层的所有内容(在这种情况下,不是SNAPSHOT的任何依赖项)。--><into layer="dependencies" /></dependencies><!-- 定义<into>块的顺序通常与写入层的顺序不同。因此,必须始终包含<layerOrder>元素,并且必须覆盖这些<into>块引用的所有层。--><layerOrder><layer>dependencies</layer><layer>spring-boot-loader</layer><layer>snapshot-dependencies</layer><layer>application</layer></layerOrder></layers>
这里配置不对的话,控制台会报错滴,根据错误提示修改就好了,奥里给!看看打出来的包内容:
下面来看一下layers.xml配置文件!
layers.xml包含三个节点:
- <application>定义了应如何对应用程序类和资源进行分层。
- <dependencies>定义了应如何分层依赖关系。
- <layerOrder>定义了应写入层的顺序。
1.<application>和<dependencies>节点下都有 <into>节点,通过<into>节点的 layer属性来声明layer层的内容。然后在<into>节点下通过<into>嵌套<include>和<exclude>元素声明哪个是包含,哪个来排除!
2.牛逼了,看到那个*了哇,还支持通配符,直接标识所有哈!
3.<dependencies>使用group:artifact[:version]模式,提供了<includeModuleDependencies />和<excludeModuleDependencies />元素,可用于包括或排除本地模块依赖性。
如果<include>未定义,则考虑所有内容(较早的块未声明)。
如果<exclude>未定义,则不应用任何排除项。
4.定义<into>块的顺序通常与写入层的顺序不同。因此,必须始终包含<layerOrder>元素,并且必须覆盖这些<into>块引用的所有层。
总结:
layers 的作用是可以启用层配置,并提供自定义层配置文件。
END