应用程序插件有助于创建可执行的 JVM 应用程序。它使得在开发过程中本地启动应用程序变得容易,并将应用程序打包为 TAR 和/或 ZIP(包括操作系统特定的启动脚本)。

应用应用程序插件也隐式应用Java 插件。源main集实际上是“应用程序”。

应用应用程序插件也会隐式应用分发插件。创建一个main分发包来打包应用程序,包括代码依赖项和生成的启动脚本。

构建 JVM 应用程序

要使用应用程序插件,请在构建脚本中包含以下内容:

build.gradle.kts
plugins {
    application
}
build.gradle
plugins {
    id 'application'
}

插件的唯一强制配置是应用程序主类(即入口点)的规范。

build.gradle.kts
application {
    mainClass = "org.gradle.sample.Main"
}
build.gradle
application {
    mainClass = 'org.gradle.sample.Main'
}

run您可以通过执行任务(类型:JavaExec )来运行应用程序。这将编译主源集,并启动一个新的 JVM,以其类(以及所有运行时依赖项)作为类路径并使用指定的主类。您可以gradle run --debug-jvm使用(请参阅JavaExec.setDebug(boolean) )以调试模式启动应用程序。

从 Gradle 4.9 开始,命令行参数可以通过--args.例如,如果您想使用命令行参数启动应用程序foo --bar,则可以使用gradle run --args="foo --bar"(请参阅JavaExec.setArgsString(java.lang.String)

如果您的应用程序需要一组特定的 JVM 设置或系统属性,您可以配置该applicationDefaultJvmArgs属性。这些 JVM 参数将应用于run任务,并在您的发行版生成的启动脚本中予以考虑。

build.gradle.kts
application {
    applicationDefaultJvmArgs = listOf("-Dgreeting.language=en")
}
build.gradle
application {
    applicationDefaultJvmArgs = ['-Dgreeting.language=en']
}

如果您的应用程序的启动脚本应位于与 不同的目录中bin,您可以配置该executableDir属性。

build.gradle.kts
application {
    executableDir = "custom_bin_dir"
}
build.gradle
application {
    executableDir = 'custom_bin_dir'
}

使用 Java 模块系统构建应用程序

Gradle 支持Java 模块的构建,如Java 库插件文档的相应部分所述。 Java 模块也可以是可运行的,您可以使用应用程序插件来运行和打包这样的模块化应用程序。为此,除了对非模块化应用程序所做的操作之外,您还需要做两件事。

首先,您需要添加一个module-info.java文件来描述您的应用程序模块。有关此主题的更多详细信息,请参阅Java 库插件文档。

其次,除了主类名称之外,您还需要告诉 Gradle 您想要运行的模块的名称,如下所示:

build.gradle.kts
application {
    mainModule = "org.gradle.sample.app" // name defined in module-info.java
    mainClass = "org.gradle.sample.Main"
}
build.gradle
application {
    mainModule = 'org.gradle.sample.app' // name defined in module-info.java
    mainClass = 'org.gradle.sample.Main'
}

就这样。如果您通过执行run任务或通过生成的启动脚本来运行应用程序,它将作为模块运行并在运行时遵守模块边界。例如,从另一个模块反射访问内部包可能会失败。

配置的主类也被烘焙到module-info.class应用程序 Jar 的文件中。如果直接使用命令运行模块化应用程序java,则提供模块名称就足够了。

您还可以查看一个现成的示例,其中包含作为多项目一部分的模块化应用程序。

构建发行版

可以通过分发插件(自动应用)来创建应用程序的分发。main使用以下内容创建分配:

表1. 分发内容
地点 内容

(根目录)

src/dist

lib

所有运行时依赖项和主要源集类文件。

bin

启动脚本(由startScripts任务生成)。

要添加到发行版的静态文件可以简单地添加到src/dist.可以通过配置主发行版公开的CopySpec来完成更高级的自定义。

build.gradle.kts
val createDocs by tasks.registering {
    val docs = layout.buildDirectory.dir("docs")
    outputs.dir(docs)
    doLast {
        docs.get().asFile.mkdirs()
        docs.get().file("readme.txt").asFile.writeText("Read me!")
    }
}

distributions {
    main {
        contents {
            from(createDocs) {
                into("docs")
            }
        }
    }
}
build.gradle
tasks.register('createDocs') {
    def docs = layout.buildDirectory.dir('docs')
    outputs.dir docs
    doLast {
        docs.get().asFile.mkdirs()
        docs.get().file('readme.txt').asFile.write('Read me!')
    }
}

distributions {
    main {
        contents {
            from(createDocs) {
                into 'docs'
            }
        }
    }
}

通过指定分发应包含任务的输出文件(请参阅增量构建),Gradle 知道必须在组装分发之前调用生成文件的任务,并将为您处理此问题。

您可以运行gradle installDist以在 中创建应用程序的映像。您可以运行来创建包含发行版的 ZIP、创建应用程序 TAR 或构建两者。build/install/projectNamegradle distZipgradle distTargradle assemble

自定义启动脚本生成

该应用程序插件可以生成开箱即用的 Unix(适用于 Linux、macOS 等)和 Windows 启动脚本。启动脚本使用定义为原始构建和运行时环境(例如JAVA_OPTSenv var)一部分的指定设置来启动JVM 。默认脚本模板基于用于启动 Gradle 本身的相同脚本,这些脚本作为 Gradle 发行版的一部分提供。

启动脚本是完全可定制的。请参阅CreateStartScripts的文档以获取更多详细信息和自定义示例。

任务

应用程序插件将以下任务添加到项目中。

runJavaExec

依赖于取决于classes

启动应用程序。

startScripts创建启动脚本

依赖于取决于jar

创建操作系统特定的脚本以将项目作为 JVM 应用程序运行。

installDist-同步

依赖于取决于jarstartScripts

将应用程序安装到指定目录中。

distZip-压缩

依赖于取决于jarstartScripts

创建完整的分发 ZIP 存档,包括运行时库和操作系统特定脚本。

distTar-柏油

依赖于取决于jarstartScripts

创建完整的分发 TAR 存档,包括运行时库和操作系统特定脚本。

应用扩展

应用程序插件向项目添加扩展,您可以使用它来配置其行为。有关扩展上可用属性的更多信息,请参阅JavaApplication DSL 文档。

您可以通过前面显示的块配置扩展application {},例如在构建脚本中使用以下内容:

build.gradle.kts
application {
    executableDir = "custom_bin_dir"
}
build.gradle
application {
    executableDir = 'custom_bin_dir'
}

启动脚本的许可

为应用程序生成的启动脚本已获得Apache 2.0 软件许可证的许可。

约定属性(已弃用)

该插件还向项目添加了一些约定属性,您可以使用它们来配置其行为。这些已被弃用并由上述扩展取代。有关它们的信息,请参阅Project DSL 文档。

与扩展属性不同,这些属性在构建脚本中显示为顶级项目属性。例如,要更改应用程序名称,您只需将以下内容添加到构建脚本中:

build.gradle.kts
application.applicationName = "my-app"
build.gradle
application.applicationName = 'my-app'