可执行档案打包

该插件可以创建包含应用程序所有依赖的可执行档案(jar 文件和 war 文件),并可运行于Java -jar.spring-doc.cadn.net.cn

可执行容器打包

可执行jar可以通过以下方式构建bootJar任务。 当Java插件被应用,是 的实例靴子. 这聚集任务会自动配置为依赖于bootJar任务如此迅速聚集(或构建)也会运行bootJar任务。spring-doc.cadn.net.cn

可执行战争打包

可执行战争可以通过以下方式构建bootWar任务。 当战争插件被应用,是 的实例启动战争. 这聚集任务会自动配置为依赖于bootWar任务如此迅速聚集(或构建)也会运行bootWar任务。spring-doc.cadn.net.cn

可执行和可部署战争的打包

战争文件可以打包成以下方式执行Java -jar并部署到外部容器。为此,嵌入的servlet容器运行时应添加到providedRuntime例如:spring-doc.cadn.net.cn

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-提供的目录中它们不会与外部容器自身的类冲突。spring-doc.cadn.net.cn

providedRuntime比Gradle更受青睐仅编译配置方面,除其他限制外,仅编译依赖不在测试类路径上,因此任何基于网页的集成测试都会失败。

打包可执行文件和纯归档

默认情况下,当bootJarbootWar任务被配置为战争任务配置为平原作为其归档分类器的约定。这确保了bootJarbootWar战争拥有不同的输出位置,使可执行档案和纯归档同时构建。spring-doc.cadn.net.cn

如果你更希望可执行档案而非普通归档使用分类器,请按照以下示例配置分类器bootJar任务:spring-doc.cadn.net.cn

tasks.named("bootJar") {
	archiveClassifier = 'boot'
}

tasks.named("jar") {
	archiveClassifier = ''
}
tasks.named<BootJar>("bootJar") {
	archiveClassifier.set("boot")
}

tasks.named<Jar>("jar") {
	archiveClassifier.set("")
}

或者,如果你希望纯归档完全不被构建,可以像下面示例所示禁用其任务任务:spring-doc.cadn.net.cn

tasks.named("jar") {
	enabled = false
}
tasks.named<Jar>("jar") {
	enabled = false
}
不要禁用创建原生图像时的任务。详情请参见 #33238

配置可执行档案封装

靴子启动战争任务是Gradle的子类战争任务。因此,打包jar或war时可用的所有标准配置选项,在打包可执行jar或war时也能使用。还提供了若干针对可执行jar和war的配置选项。spring-doc.cadn.net.cn

主类配置

默认情况下,可执行档案的主类将通过寻找具有公共静态空缺主(String[])方法在主源集输出中。spring-doc.cadn.net.cn

主类也可以通过任务的mainClass财产:spring-doc.cadn.net.cn

tasks.named("bootJar") {
	mainClass = 'com.example.ExampleApplication'
}
tasks.named<BootJar>("bootJar") {
	mainClass.set("com.example.ExampleApplication")
}

或者,主类名称也可以在项目范围内使用mainClassSpring靴DSL的属性:spring-doc.cadn.net.cn

springBoot {
	mainClass = 'com.example.ExampleApplication'
}
springBoot {
	mainClass.set("com.example.ExampleApplication")
}

如果应用插件已被应用mainClass属性必须配置,并且可用于相同的目的:spring-doc.cadn.net.cn

application {
	mainClass = 'com.example.ExampleApplication'
}
application {
	mainClass.set("com.example.ExampleApplication")
}

最后,是起始级属性可以在任务清单上配置:spring-doc.cadn.net.cn

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中。spring-doc.cadn.net.cn

如果你想包含在仅开发在你的归档中配置,配置其任务的类路径以包含配置,如下例所示bootWar任务:spring-doc.cadn.net.cn

tasks.named("bootWar") {
	classpath configurations.developmentOnly
}
tasks.named<BootWar>("bootWar") {
	classpath(configurations["developmentOnly"])
}

配置需要解压的库

大多数库嵌套在可执行档案中时可以直接使用,但某些库可能会存在问题。例如,JRuby 包含自己的嵌套 jar 支持,假设jruby-complete.jar始终直接在文件系统中可用。spring-doc.cadn.net.cn

为了处理任何有问题的库,可执行档案可以配置为在运行该存档时将特定的嵌套jar解压到临时目录。库可以识别为需要使用与源jar文件绝对路径匹配的Ant式解压模式:spring-doc.cadn.net.cn

tasks.named("bootJar") {
	requiresUnpack '**/jruby-complete-*.jar'
}
tasks.named<BootJar>("bootJar") {
	requiresUnpack("**/jruby-complete-*.jar")
}

为了更好地控制,也可以使用闭包。闭包传递给FileTreeElement并且应返回布尔指示是否需要拆箱。spring-doc.cadn.net.cn

使用 PropertiesLauncher

使用PropertiesLauncher要启动可执行的 jar 或 war,请配置任务的 manifest 以设置主级属性:spring-doc.cadn.net.cn

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/LIBWEB-INF/lib-提供的. 对于需要从jar内容构建docker镜像的情况,能够进一步分开这些目录以便将它们写入不同的层是很有用的。spring-doc.cadn.net.cn

分层jar采用与普通启动打包jar相同的布局,但包含一个描述每一层的额外元数据文件。spring-doc.cadn.net.cn

默认情况下,定义了以下层:spring-doc.cadn.net.cn

图层顺序很重要,因为它决定了当应用程序部分发生变化时,前一层被缓存的可能性。默认顺序为依赖,Spring Boot加载器,快照依赖关系,应用. 最不可能改变的内容应先添加,然后是更可能变化的图层。spring-doc.cadn.net.cn

要禁用此功能,您可以以下方式作:spring-doc.cadn.net.cn

tasks.named("bootJar") {
	layered {
		enabled = false
	}
}
tasks.named<BootJar>("bootJar") {
	layered {
		enabled.set(false)
	}
}

当制造层叠罐或战争时,Spring-boot-jarmode-toolsjar 将作为依赖添加到你的归档中。有了这个 jar 在类路径上,你可以以特殊模式启动应用程序,允许引导代码运行与应用完全不同的程序,例如提取层的程序。如果你想排除这个依赖,可以通过以下方式实现:spring-doc.cadn.net.cn

tasks.named("bootJar") {
	includeTools = false
}
tasks.named<BootJar>("bootJar") {
	includeTools.set(false)
}

自定义图层配置

根据你的应用,你可能需要调整图层的创建方式并添加新的图层。spring-doc.cadn.net.cn

这可以通过配置来实现,描述如何将罐子或战争分成层,以及这些层的顺序。以下示例展示了如何明确定义上述默认顺序:spring-doc.cadn.net.cn

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定义为三个部分:spring-doc.cadn.net.cn

嵌 套intoLayer闭包被使用应用依赖用于认领某一层内容的部分。这些闭包按定义顺序从上到下评估。任何未被先前intoLayer关闭的可能性仍可为后续的机构考虑。spring-doc.cadn.net.cn

intoLayer关闭声明内容使用嵌套包括排除调用。 这应用闭包采用Ant式路径匹配来进行包含/排除参数。 这依赖节段用途Group:Artifact[:version]模式。 它还提供includeProjectDependencies()exclusionProjectDependencies()可用于包含或排除项目依赖性的方法。spring-doc.cadn.net.cn

如果没有包括接着进行呼叫,然后考虑所有未被先前关闭占据的内容。spring-doc.cadn.net.cn

如果没有排除打电话后,不适用排除条款。spring-doc.cadn.net.cn

正在看依赖在上述例子中,我们可以看到第一个intoLayer将申报所有项目依赖应用层。 下一个intoLayer将对快照依赖关系层。 第三场也是最后一场intoLayer会对剩余的一切(在此例中,任何非项目依赖或非快照的依赖)索赔依赖层。spring-doc.cadn.net.cn

应用闭合也有类似规则。首次索赔org/springframework/boot/loader/**内容包括Spring Boot加载器层。 然后申领剩余的职业和资源应用层。spring-doc.cadn.net.cn

顺序是intoLayer闭包的添加通常与层的写入顺序不同。因此层次序方法必须始终被调用,并且必须覆盖所有由intoLayer调用。