构建工具插件
3. Spring Boot AntLib 模块
Spring Boot AntLib 模块为 Apache Ant 提供了基本的 Spring Boot 支持。
您可以使用该模块创建可执行 jar。
要使用该模块,您需要在 中声明一个额外的命名空间,如以下示例所示:spring-boot
build.xml
<project xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:spring-boot="antlib:org.springframework.boot.ant"
name="myapp" default="build">
...
</project>
您需要记住使用 option 启动 Ant,如以下示例所示:-lib
$ ant -lib <directory containing spring-boot-antlib-3.1.12.jar>
“使用 Spring Boot”部分包括将 Apache Ant 与 spring-boot-antlib 一起使用的更完整示例。 |
3.1. Spring Boot Ant 任务
声明命名空间后,可以使用以下其他任务:spring-boot-antlib
3.1.1. 使用 “exejar” 任务
您可以使用该任务创建 Spring Boot 可执行 jar。
该任务支持以下属性:exejar
属性 | 描述 | 必填 |
---|---|---|
|
要创建的目标 jar 文件 |
是的 |
|
Java 类文件的根目录 |
是的 |
|
要运行的主要应用程序类 |
否(默认是找到的第一个声明 |
以下嵌套元素可用于任务:
元素 | 描述 |
---|---|
|
一个或多个 Resource Collections,描述应添加到所创建 jar 文件内容的一组 Resources。 |
|
应添加到构成应用程序的运行时依赖项 Classpath 的 jar 库集中的一个或多个 Resource Collections。 |
3.1.2. 示例
本节介绍 Ant 任务的两个示例。
<spring-boot:exejar destfile="target/my-application.jar"
classes="target/classes" start-class="com.example.MyApplication">
<resources>
<fileset dir="src/main/resources" />
</resources>
<lib>
<fileset dir="lib" />
</lib>
</spring-boot:exejar>
<exejar destfile="target/my-application.jar" classes="target/classes">
<lib>
<fileset dir="lib" />
</lib>
</exejar>
4. 支持其他构建系统
如果您想使用 Maven、Gradle 或 Ant 以外的构建工具,您可能需要开发自己的插件。 可执行 jar 需要遵循特定格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参阅附录中的“可执行 jar 格式”部分)。
Spring Boot Maven 和 Gradle 插件都用于实际生成 jar。
如果需要,您可以直接使用此库。spring-boot-loader-tools
4.1. 重新打包存档
要重新打包现有存档,使其成为自包含的可执行存档,请使用 。
该类采用一个引用现有 jar 或 war 存档的构造函数参数。
使用两种可用方法之一替换原始文件或写入新目标。
在运行重新打包程序之前,还可以在重新打包程序上配置各种设置。org.springframework.boot.loader.tools.Repackager
Repackager
repackage()
4.2. 嵌套库
重新打包存档时,您可以使用界面包含对依赖项文件的引用。
我们没有提供任何具体的实现,因为它们通常是特定于构建系统的。org.springframework.boot.loader.tools.Libraries
Libraries
如果您的存档已包含库,则可以使用 。Libraries.NONE
4.3. 查找主类
如果不用于指定主类,则重新打包程序将使用 ASM 读取类文件,并尝试使用方法查找合适的类。
如果找到多个候选者,则会引发异常。Repackager.setMainClass()
public static void main(String[] args)
4.4. Repackage 实现示例
以下示例显示了典型的 repackage 实现:
public class MyBuildTool {
public void build() throws IOException {
File sourceJarFile = ...
Repackager repackager = new Repackager(sourceJarFile);
repackager.setBackupSource(false);
repackager.repackage(this::getLibraries);
}
private void getLibraries(LibraryCallback callback) throws IOException {
// Build system specific implementation, callback for each dependency
for (File nestedJar : getCompileScopeJars()) {
callback.library(new Library(nestedJar, LibraryScope.COMPILE));
}
// ...
}
private List<File> getCompileScopeJars() {
return ...
}
}
class MyBuildTool {
@Throws(IOException::class)
fun build() {
val sourceJarFile: File? = ...
val repackager = Repackager(sourceJarFile)
repackager.setBackupSource(false)
repackager.repackage { callback: LibraryCallback -> getLibraries(callback) }
}
@Throws(IOException::class)
private fun getLibraries(callback: LibraryCallback) {
// Build system specific implementation, callback for each dependency
for (nestedJar in getCompileScopeJars()!!) {
callback.library(Library(nestedJar, LibraryScope.COMPILE))
}
// ...
}
private fun getCompileScopeJars(): List<File?>? {
return ...
}
}
5. 接下来要读什么
如果您对构建工具插件的工作原理感兴趣,可以查看 GitHub 上的 spring-boot-tools
模块。
附录中介绍了可执行 jar 格式的更多技术细节。
如果您有与构建相关的具体问题,请参阅“操作方法”指南。