可执行档案打包
该插件可以创建包含应用程序所有依赖的可执行档案(jar 文件和 war 文件),并可运行于Java -jar.
可执行容器打包
可执行jar可以通过以下方式构建bootJar任务。 当Java插件被应用,是 的实例靴子. 这聚集任务会自动配置为依赖于bootJar任务如此迅速聚集(或构建)也会运行bootJar任务。
可执行战争打包
可执行战争可以通过以下方式构建bootWar任务。 当战争插件被应用,是 的实例启动战争. 这聚集任务会自动配置为依赖于bootWar任务如此迅速聚集(或构建)也会运行bootWar任务。
可执行和可部署战争的打包
战争文件可以打包成以下方式执行Java -jar并部署到外部容器。为此,嵌入的servlet容器运行时应添加到providedRuntime例如:
-
Groovy
-
Kotlin
dependencies {
implementation('org.springframework.boot:spring-boot-starter-webmvc')
providedRuntime('org.springframework.boot:spring-boot-starter-tomcat-runtime')
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat-runtime")
}
这确保了运行时 jar 被打包在 war 文件的WEB-INF/lib-提供的目录中它们不会与外部容器自身的类冲突。
providedRuntime比Gradle更受青睐仅编译配置方面,除其他限制外,仅编译依赖不在测试类路径上,因此任何基于网页的集成测试都会失败。 |
打包可执行文件和纯归档
默认情况下,当bootJar或bootWar任务被配置为罐或战争任务配置为平原作为其归档分类器的约定。这确保了bootJar和罐或bootWar和战争拥有不同的输出位置,使可执行档案和纯归档同时构建。
如果你更希望可执行档案而非普通归档使用分类器,请按照以下示例配置分类器罐和bootJar任务:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
archiveClassifier = 'boot'
}
tasks.named("jar") {
archiveClassifier = ''
}
tasks.named<BootJar>("bootJar") {
archiveClassifier.set("boot")
}
tasks.named<Jar>("jar") {
archiveClassifier.set("")
}
或者,如果你希望纯归档完全不被构建,可以像下面示例所示禁用其任务罐任务:
-
Groovy
-
Kotlin
tasks.named("jar") {
enabled = false
}
tasks.named<Jar>("jar") {
enabled = false
}
不要禁用罐创建原生图像时的任务。详情请参见 #33238。 |
配置可执行档案封装
主类配置
默认情况下,可执行档案的主类将通过寻找具有公共静态空缺主(String[])方法在主源集输出中。
主类也可以通过任务的mainClass财产:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
mainClass = 'com.example.ExampleApplication'
}
tasks.named<BootJar>("bootJar") {
mainClass.set("com.example.ExampleApplication")
}
或者,主类名称也可以在项目范围内使用mainClassSpring靴DSL的属性:
-
Groovy
-
Kotlin
springBoot {
mainClass = 'com.example.ExampleApplication'
}
springBoot {
mainClass.set("com.example.ExampleApplication")
}
如果应用插件已被应用mainClass属性必须配置,并且可用于相同的目的:
-
Groovy
-
Kotlin
application {
mainClass = 'com.example.ExampleApplication'
}
application {
mainClass.set("com.example.ExampleApplication")
}
最后,是起始级属性可以在任务清单上配置:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
manifest {
attributes 'Start-Class': 'com.example.ExampleApplication'
}
}
tasks.named<BootJar>("bootJar") {
manifest {
attributes("Start-Class" to "com.example.ExampleApplication")
}
}
如果主类是用Kotlin编写的,应使用生成的Java类名称。默认情况下,这是带有Kt加上后缀。 例如示例应用成为ExampleApplicationKt. 如果用@JvmName那就应该用这个名字。 |
包括仅开发依赖
默认情况下,所有在仅开发配置将被排除在可执行的jar或war中。
如果你想包含在仅开发在你的归档中配置,配置其任务的类路径以包含配置,如下例所示bootWar任务:
-
Groovy
-
Kotlin
tasks.named("bootWar") {
classpath configurations.developmentOnly
}
tasks.named<BootWar>("bootWar") {
classpath(configurations["developmentOnly"])
}
配置需要解压的库
大多数库嵌套在可执行档案中时可以直接使用,但某些库可能会存在问题。例如,JRuby 包含自己的嵌套 jar 支持,假设jruby-complete.jar始终直接在文件系统中可用。
为了处理任何有问题的库,可执行档案可以配置为在运行该存档时将特定的嵌套jar解压到临时目录。库可以识别为需要使用与源jar文件绝对路径匹配的Ant式解压模式:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
requiresUnpack '**/jruby-complete-*.jar'
}
tasks.named<BootJar>("bootJar") {
requiresUnpack("**/jruby-complete-*.jar")
}
为了更好地控制,也可以使用闭包。闭包传递给FileTreeElement并且应返回布尔指示是否需要拆箱。
使用 PropertiesLauncher
使用PropertiesLauncher要启动可执行的 jar 或 war,请配置任务的 manifest 以设置主级属性:
-
Groovy
-
Kotlin
tasks.named("bootWar") {
manifest {
attributes 'Main-Class': 'org.springframework.boot.loader.launch.PropertiesLauncher'
}
}
tasks.named<BootWar>("bootWar") {
manifest {
attributes("Main-Class" to "org.springframework.boot.loader.launch.PropertiesLauncher")
}
}
分层罐装或战争包装
默认情况下,bootJar任务构建一个包含应用程序类和依赖的档案启动-INF/类和启动-INF/LIB分别。 同样地bootWar构建一个包含应用类的归档网络基础/课程以及WEB-INF/LIB和WEB-INF/lib-提供的. 对于需要从jar内容构建docker镜像的情况,能够进一步分开这些目录以便将它们写入不同的层是很有用的。
分层jar采用与普通启动打包jar相同的布局,但包含一个描述每一层的额外元数据文件。
默认情况下,定义了以下层:
-
依赖对于任何非项目依赖,其版本不包含快照. -
Spring Boot加载器关于罐装载机课程。 -
快照依赖关系对于任何非项目依赖,其版本包含快照. -
应用用于项目依赖、应用类和资源。
图层顺序很重要,因为它决定了当应用程序部分发生变化时,前一层被缓存的可能性。默认顺序为依赖,Spring Boot加载器,快照依赖关系,应用. 最不可能改变的内容应先添加,然后是更可能变化的图层。
要禁用此功能,您可以以下方式作:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
layered {
enabled = false
}
}
tasks.named<BootJar>("bootJar") {
layered {
enabled.set(false)
}
}
当制造层叠罐或战争时,Spring-boot-jarmode-toolsjar 将作为依赖添加到你的归档中。有了这个 jar 在类路径上,你可以以特殊模式启动应用程序,允许引导代码运行与应用完全不同的程序,例如提取层的程序。如果你想排除这个依赖,可以通过以下方式实现:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
includeTools = false
}
tasks.named<BootJar>("bootJar") {
includeTools.set(false)
}
自定义图层配置
根据你的应用,你可能需要调整图层的创建方式并添加新的图层。
这可以通过配置来实现,描述如何将罐子或战争分成层,以及这些层的顺序。以下示例展示了如何明确定义上述默认顺序:
-
Groovy
-
Kotlin
tasks.named("bootJar") {
layered {
application {
intoLayer("spring-boot-loader") {
include "org/springframework/boot/loader/**"
}
intoLayer("application")
}
dependencies {
intoLayer("application") {
includeProjectDependencies()
}
intoLayer("snapshot-dependencies") {
include "*:*:*SNAPSHOT"
}
intoLayer("dependencies")
}
layerOrder = ["dependencies", "spring-boot-loader", "snapshot-dependencies", "application"]
}
}
tasks.named<BootJar>("bootJar") {
layered {
application {
intoLayer("spring-boot-loader") {
include("org/springframework/boot/loader/**")
}
intoLayer("application")
}
dependencies {
intoLayer("application") {
includeProjectDependencies()
}
intoLayer("snapshot-dependencies") {
include("*:*:*SNAPSHOT")
}
intoLayer("dependencies")
}
layerOrder.set(listOf("dependencies", "spring-boot-loader", "snapshot-dependencies", "application"))
}
}
这分层的DSL定义为三个部分:
-
这
应用闭包定义了应用类和资源应如何分层。 -
这
依赖闭合定义了依赖应如何分层。 -
这
层次序方法定义了图层应写入的顺序。
嵌 套intoLayer闭包被使用应用和依赖用于认领某一层内容的部分。这些闭包按定义顺序从上到下评估。任何未被先前intoLayer关闭的可能性仍可为后续的机构考虑。
这intoLayer关闭声明内容使用嵌套包括和排除调用。 这应用闭包采用Ant式路径匹配来进行包含/排除参数。 这依赖节段用途Group:Artifact[:version]模式。 它还提供includeProjectDependencies()和exclusionProjectDependencies()可用于包含或排除项目依赖性的方法。
如果没有包括接着进行呼叫,然后考虑所有未被先前关闭占据的内容。
如果没有排除打电话后,不适用排除条款。
正在看依赖在上述例子中,我们可以看到第一个intoLayer将申报所有项目依赖应用层。 下一个intoLayer将对快照依赖关系层。 第三场也是最后一场intoLayer会对剩余的一切(在此例中,任何非项目依赖或非快照的依赖)索赔依赖层。
这应用闭合也有类似规则。首次索赔org/springframework/boot/loader/**内容包括Spring Boot加载器层。 然后申领剩余的职业和资源应用层。
顺序是intoLayer闭包的添加通常与层的写入顺序不同。因此层次序方法必须始终被调用,并且必须覆盖所有由intoLayer调用。 |