gradle的二进制版本
创建有用的应用程序后,很可能我们想与其他人共享它。 一种方法是创建一个可以从我们的网站下载的二进制发行版。
这篇博客文章描述了如何满足以下要求的二进制发行版:
- 我们的二进制分发不得使用所谓的“胖子”方法。 换句话说,我们的应用程序的依赖项不得与我们的应用程序打包到同一jar文件中。
- 我们的二进制发行版必须包含* nix和Windows操作系统的启动脚本。
- 我们的二进制发行版的根目录必须包含我们的应用程序的许可证。
让我们开始吧。
补充阅读:
- Gradle入门:简介可帮助您安装Gradle,描述Gradle构建的基本概念,并描述如何使用Gradle插件为构建提供功能。
- Gradle入门:我们的第一个Java项目描述了如何使用Gradle创建Java项目并将应用程序打包到可执行jar文件中。
- Gradle入门:依赖性管理介绍了如何管理Gradle项目的依赖性。
创建一个二进制分布
该应用程序插件是Gradle插件,它使我们能够运行我们的应用程序,进行安装,并创建不使用“胖子”方法的二进制发行版。
我们可以通过对在Gradle入门教程的上一部分中创建的示例应用程序的build.gradle文件进行以下更改来创建二进制分发:
- 删除jar任务的配置。
- 将应用程序插件应用于我们的项目。
- 通过设置mainClassName属性的值来配置应用程序的主类。
在对build.gradle文件进行了这些更改之后,其外观如下(突出显示了相关部分):
apply plugin: 'application'
apply plugin: 'java'repositories {mavenCentral()
}dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'
}mainClassName = 'net.petrikainulainen.gradle.HelloWorld'
该应用程序插件将五个任务添加到我们的项目中:
- 运行任务将启动应用程序。
- startScripts任务将启动脚本创建到build / scripts目录。 该任务为Windows和* nix操作系统创建启动脚本。
- installApp任务将应用程序安装到build / install / [项目名称]目录中。
- distZip任务创建二进制发行版,并将其打包为可从build / distributions目录中找到的zip文件。
- distTar任务创建二进制发行版,并将其打包到可从build / distributions目录中找到的tar文件中。
我们可以通过在项目的根目录中运行以下命令之一来创建二进制分发: gradle distZip或gradle distTar 。 如果我们创建打包为zip文件的二进制分发,请参见以下输出:
> gradle distZip
:compileJava
:processResources
:classes
:jar
:startScripts
:distZipBUILD SUCCESSFULTotal time: 4.679 secs
如果解压缩由应用程序插件创建的已创建二进制发行版,则将获得以下目录结构:
- bin目录包含启动脚本。
- lib目录包含我们应用程序的jar文件及其依赖项。
您可以通过阅读第45章“ Gradle用户指南”中的“应用程序插件”来获取有关应用程序插件的更多信息。
现在,我们可以创建一个满足几乎所有需求的二进制发行版。 但是,我们仍然需要将应用程序的许可证添加到二进制分发的根目录中。 让我们继续前进,找出我们如何做到这一点。
将我们的应用程序的许可证文件添加到二进制分发中
通过执行以下步骤,我们可以将应用程序的许可证添加到二进制分发中:
- 创建一个任务,将许可证文件从我们项目的根目录复制到构建目录。
- 将许可证文件添加到创建的二进制分发的根目录中。
让我们继续仔细研究这些步骤。
将许可证文件复制到构建目录
包含我们的应用程序许可证的文件的名称为LICENSE ,可以从我们项目的根目录中找到。
我们可以按照以下步骤将许可证文件复制到构建目录:
- 创建一个新的Copy任务,称为copyLicense 。
- 使用CopySpec接口的from()方法配置源文件。 将字符串“ LICENSE”作为方法参数传递。
- 使用CopySpec接口的into()方法配置目标目录。 将$ buildDir属性的值作为方法参数传递。
完成这些步骤后, build.gradle文件如下所示(相关部分突出显示):
apply plugin: 'application'
apply plugin: 'java'repositories {mavenCentral()
}dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'
}mainClassName = 'net.petrikainulainen.gradle.HelloWorld'task copyLicense(type: Copy) {from "LICENSE"into "$buildDir"
}
附加信息:
- 复制任务的API文档
- 《 Gradle用户指南》的16.6节复制文件
现在,我们已经创建了一个任务,该任务将LICENSE文件从项目的根目录复制到构建目录。 但是,当我们在项目的根目录中运行gradle distZip命令时,将看到以下输出:
> gradle distZip
:compileJava
:processResources
:classes
:jar
:startScripts
:distZipBUILD SUCCESSFULTotal time: 4.679 secs
换句话说,我们的新任务不会被调用,这自然意味着许可证文件不包含在我们的二进制发行版中。 让我们解决这个问题。
将许可证文件添加到二进制分发版
我们可以按照以下步骤将许可证文件添加到创建的二进制分发中:
- 通过从声明中删除字符串“(类型:复制)”,将copyLicense任务从“ 复制”任务转换为“常规” Gradle任务。
- 通过执行以下步骤,修改copyLicense任务的实现:
- 配置copyLicense任务的输出。 创建一个新的File对象,该对象指向从构建目录中找到的许可证文件,并将其设置为outputs.file属性的值。
- 将许可证文件从项目的根目录复制到构建目录。
- 应用程序插件为我们的项目设置了一个名为applicationDistribution的CopySpec属性。 我们可以使用它来将许可证文件包括到创建的二进制发行版中。 我们可以按照以下步骤进行操作:
- 使用CopySpec接口的from()方法配置许可证文件的位置,并将copyLicense任务的输出作为方法参数传递。
- 使用CopySpec接口的into()方法配置目标目录,并传递一个空String作为方法参数。
完成这些步骤后, build.gradle文件如下所示(相关部分突出显示):
apply plugin: 'application'
apply plugin: 'java'repositories {mavenCentral()
}dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'
}mainClassName = 'net.petrikainulainen.gradle.HelloWorld'task copyLicense {outputs.file new File("$buildDir/LICENSE")doLast {copy {from "LICENSE"into "$buildDir"}}
}applicationDistribution.from(copyLicense) {into ""
}
补充阅读:
- Task的doLast()操作的API文档
- 第45.5节在分发的Gradle用户指南中包括其他资源
- ApplicationPluginConvention类的Groovydoc
当在项目的根目录中运行命令gradle distZip时 ,将看到以下输出:
> gradle distZip
:copyLicense
:compileJava
:processResources
:classes
:jar
:startScripts
:distZipBUILD SUCCESSFULTotal time: 5.594 secs
如我们所见,现在将调用copyLicense任务,并且如果解包二进制分发包,则会注意到LICENSE文件是从其根目录中找到的。
让我们继续总结一下我们从此博客文章中学到的知识。
摘要
这篇博客文章教会了我们三件事:
- 我们了解到可以使用应用程序插件创建二进制发行版。
- 我们学习了如何使用复制任务将文件从源目录复制到目标目录。
- 我们了解了如何将文件添加到由应用程序插件创建的二进制分发中。
如果您想玩这个博客文章的示例应用程序, 可以从Github获得 。
翻译自: https://www.javacodegeeks.com/2014/09/getting-started-with-gradle-creating-a-binary-distribution.html
gradle的二进制版本