Gradle入门:创建二进制分发

创建有用的应用程序之后,很可能我们想与其他人共享它。 一种方法是创建一个可以从我们的网站下载的二进制发行版。

这篇博客文章描述了如何满足以下要求的二进制发行版:

  • 我们的二进制分发绝对不能使用所谓的“胖子”方法。 换句话说,我们的应用程序的依赖项不得与我们的应用程序打包到同一jar文件中。
  • 我们的二进制发行版必须包含* nix和Windows操作系统的启动脚本。
  • 我们的二进制发行版的根目录必须包含我们的应用程序的许可证。

让我们开始吧。

补充阅读:

  • Gradle入门:简介可帮助您安装Gradle,描述Gradle构建的基本概念,并描述如何使用Gradle插件为构建提供功能。
  • Gradle入门:我们的第一个Java项目描述了如何使用Gradle创建Java项目并将应用程序打包到可执行jar文件中。
  • Gradle入门:依赖性管理介绍了如何管理Gradle项目的依赖性。

创建一个二进制分布

该应用程序插件是Gradle插件,它使我们可以运行我们的应用程序,进行安装,并创建不使用“胖子”方法的二进制发行版。

我们可以通过对在Gradle入门教程的上一部分中创建的示例应用程序的build.gradle文件进行以下更改来创建二进制分发:

  1. 删除jar任务的配置。
  2. 将应用程序插件应用于我们的项目。
  3. 通过设置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 distZipgradle distTar 。 如果我们创建打包为zip文件的二进制分发,请参见以下输出:

> gradle distZip
:compileJava
:processResources
:classes
:jar
:startScripts
:distZipBUILD SUCCESSFULTotal time: 4.679 secs

如果解压缩由应用程序插件创建的已创建二进制发行版,则将获得以下目录结构:

  • bin目录包含启动脚本。
  • lib目录包含我们应用程序的jar文件及其依赖项。

您可以通过阅读第45章“ Gradle用户指南”中的应用程序插件来获取有关应用程序插件的更多信息。

现在,我们可以创建一个满足几乎所有需求的二进制发行版。 但是,我们仍然需要将应用程序的许可证添加到二进制分发的根目录中。 让我们继续前进,找出我们如何做到这一点。

将我们的应用程序的许可证文件添加到二进制分发中

通过执行以下步骤,我们可以将应用程序的许可证添加到二进制分发中:

  1. 创建一个任务,将许可证文件从我们项目的根目录复制到构建目录。
  2. 将许可证文件添加到创建的二进制分发的根目录中。

让我们继续仔细研究这些步骤。

将许可证文件复制到构建目录

包含我们的应用程序许可证的文件的名称为LICENSE ,可以从我们项目的根目录中找到。

我们可以按照以下步骤将许可证文件复制到构建目录:

  1. 创建一个新的Copy任务,称为copyLicense
  2. 使用CopySpec接口的from()方法配置源文件。 将字符串“ LICENSE”作为方法参数传递。
  3. 使用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

换句话说,我们的新任务不会被调用,这自然意味着许可证文件不包含在我们的二进制发行版中。 让我们解决这个问题。

将许可证文件添加到二进制分发版

我们可以按照以下步骤将许可证文件添加到创建的二进制分发中:

  1. 通过从声明中删除字符串“(类型:复制)”,将copyLicense任务从“ 复制”任务转换为“常规” Gradle任务。
  2. 通过执行以下步骤,修改copyLicense任务的实现:
    1. 配置copyLicense任务的输出。 创建一个新的File对象,该对象指向从构建目录中找到的许可证文件,并将其设置为outputs.file属性的值。
    2. 将许可证文件从项目的根目录复制到构建目录。
  3. 应用程序插件为我们的项目设置了一个名为applicationDistributionCopySpec属性。 我们可以使用它来将许可证文件包括到创建的二进制发行版中。 我们可以按照以下步骤进行操作:
    1. 使用CopySpec接口的from()方法配置许可证文件的位置,并将copyLicense任务的输出作为方法参数传递。
    2. 使用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 ""
}

补充阅读:

  • TaskdoLast()操作的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的Google Adsense帐户被关

一、 上周四,我收到Google的邮件,宣布关闭我的Adsense帐户。 "您好! 查看了相关记录后,我们确认您的 AdSense 帐户存在引起无效活动的风险。保护 AdWords 广告客户,使其免受无效活动的侵害是我们的责任&#xff0…

网格布局之网格元素放置算法

接下来的网格元素放置算法将网格元素的自动位置解析为确定位置,确保每个网格元素具有布局明确的网格区域。(Grid spans 不需要特别的解析;如果没有明确指定,默认是1) 注意:当显式网格中没有位置放置自动放置…

csharp: ODP.NET,System.Data.OracleClient(.net 4.0) and System.Data.OleDb读取Oracle g 11.2.0的区别...

ODP.NET: 引用: using Oracle.DataAccess; //Oracle g 11.2.0 using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; //下载 http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html //引用:D:\app\geovindu…

AngularJS快速入门指南15:API

API即Application Programming Interface(应用程序接口)。 AngularJS全局API AngularJS全局API是一组全局JavaScript函数,用来进行一些常用的操作,例如: 比较两个对象迭代对象进行数据格式转换 全局API函数可以通过an…

Java 9幕后花絮:新功能从何而来?

找出Java幕后发生的事情,以及新功能如何实现 在上一篇文章中,我们介绍了即将发布的Java 9版本的新功能和尚待解决的功能,并简要提到了将新功能添加到下一个版本之前要经历的过程。 由于此过程几乎影响了所有Java开发人员,但大多数…

TypeScript 联合类型(union type)

TS是JS的超集,在JS的基础上添加了一套类型系统,这样的TS可以被静态分析带来的好处显而易见。 let val: string val;声明一个string类型的变量val。 let val: string val; val 1; // Type number is not assignable to type string.因为number类型和…

sudo apt-get install libstdc++6

sudo apt-get install libstdc6 yum install libncurses.so.5 sudo apt-get install libncurses.so.5 sudo apt-get install lib32ncurses5 apt-get update把源更新一下 使用gdb时的指令 (gbd) info line *0x08xxxx sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.…

AngularJS快速入门指南03:表达式

AngularJS通过表达式将数据绑定到HTML。 AngularJS表达式 AngularJS表达式写在双大括号中:{{ 表达式语句 }}。 AngularJS表达式绑定数据到HTML的方式与ng-bind指令的方式相同。 AngularJS会准确地将表达式“输出”为计算的结果。 AngularJS表达式与JavaScript表达式…

零基础快速上手HarmonyOS ArkTS开发2---ArkTS开发实践

ArkTS开发实践: 接着上一次零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍继续, 在上一次对于ArkTS的基础知识进行了学习,依照官方的课程计划,还有两个具体的小案例需要来实践实践: 实践出…

无状态Spring安全性第2部分:无状态身份验证

Spring Stateless Security系列的第二部分是关于以无状态方式探索身份验证的方法。 如果您错过了CSRF的第一部分,可以在这里找到。 因此,在谈论身份验证时,其全部内容就是让客户端以可验证的方式向服务器标识自己。 通常,这始于服…

TypeScript 交叉类型(intersection type)

在TS中和联合类型(union type)对应的还有交叉类型(intersection type)。 交叉类型的出现主要为了组合多个对象类型(object type),因为相对于interface,object type没法继承,那么就可以通过union type来实现混合的目的,从而实现继承…

【转】JAVA中的转义字符

JAVA中转义字符: 1.八进制转义序列:\ 1到3位5数字;范围\000~\377 \0:空字符 2.Unicode转义字符:\u 四个十六进制数字;0~65535 \u0000:空字符 3.特殊字符:就3个 \"&#xff1a…

八、VueJs 填坑日记之参数传递及内容页面的开发

我们在上一篇博文中&#xff0c;渲染出来了一个列表&#xff0c;并在列表中使用了router-link标签&#xff0c;标签内的&#xff1a;to就是链接地址&#xff0c;昨天咱们是<router-link :to"/content/ i.id">这样写的&#xff0c;今天我们来完成内容页面的渲染…

为Kindeditor控件添加图片自动上传功能

Kindeditor是一款功能强大的开源在线HTML编辑器&#xff0c;支持所见即所得的编辑效果。它使用JavaScript编写&#xff0c;可以无缝地与多个不同的语言环境进行集成&#xff0c;如.NET、PHP、ASP、Java等。官方网站可以查看这里&#xff1a;http://kindeditor.net/index.php Ki…

TypeScript类型推论(Type Inference)

要完全理解类型推论需要完整理解类型上下文&#xff0c;并且理解TS对于是否可以使用类型推论是基于静态分析完成的。 上下文类型应用在许多地方。常见的例子包括函数调用的参数&#xff0c;赋值的右手端位置&#xff0c;类型断言&#xff0c;对象和数组的成员&#xff0c;和返回…

4个万无一失的技巧让您开始使用JBoss BRMS 6.0.3

上周&#xff0c;红帽发布了标记为6.0.3的JBoss BRMS的下一版本&#xff0c;已订阅的用户可以在其客户门户中使用。 如果您对该版本的新增功能感到好奇&#xff0c;请在客户门户网站上在线查看版本说明和其余文档 。 我们正在寻找一些简单的方法来开始使用此新版本&#xff0…

统一命名规则

1. #define 保护 所有头文件都应该使用 #define 防止头文件被多重包含, 命名格式当是:<PROJECT>_<PATH>_<FILE>_H_ 项目 SkinTK中的头文件 SkinTK/SkinTK/targetver.h 可按如下方式保护: #ifndef SKINTK_SKINTK_TARGETVER_H_ #define SKINTK_SKINTK_TARGETVE…

中国移动MM7 API用户手册(七)

4.4 VASP接收状态报告&#xff08;上行业务&#xff09;当VASP在发送MM7SubmitReq给MMSC时设置需要发送状态报告的请求为true时&#xff0c;MMSC在收到MM7SubmitReq后&#xff0c;会发送状态报告给VASP&#xff0c;此时VASP可以进行接收。接收方式和接收传送消息一样&#xff…

如何仅通过CSS实现多行文本超长自动省略号

在CSS中&#xff0c;我们可以通过下面的样式实现DIV元素中文本超长后自动截断并以省略号结尾&#xff1a; overflow: hidden;word-break: normal;text-overflow: ellipsis; text-overflow: ellipsis是实现文本截断后以省略号结尾的关键样式&#xff0c;但问题是如果添加该样式则…

带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分

这是Angular JS承诺的Java EE 7的后续版本–第1部分 。 花了比我预期更长的时间&#xff08;找到时间来准备代码和博客文章&#xff09;&#xff0c;但是终于到了&#xff01; 应用程序 第1部分中的原始应用程序只是带有分页的简单列表&#xff0c;以及提供列表数据的REST服务…