Gradle入门:我们的第一个Java项目

这篇博客文章描述了如何使用Gradle编译和打包一个简单的Java项目。

我们的Java项目只有一个要求:

我们的构建脚本必须创建一个可执行的jar文件。 换句话说,我们必须能够使用以下命令运行程序:

java -jar jarfile.jar

让我们找出如何满足这一要求。

创建一个Java项目

我们可以通过应用Java插件来创建Java项目。 我们可以通过在build.gradle文件中添加以下行来实现

apply plugin: 'java'

这就对了。 现在,我们已经创建了一个Java项目。

Java插件为我们的构建添加了新的约定(例如,默认的项目布局), 新的任务和新的属性 。

让我们继续前进,快速浏览一下默认的项目布局。

Java项目的项目布局

Java项目的默认项目布局如下:

  • src / main / java目录包含我们项目的源代码。
  • src / main / resources目录包含我们项目的资源(例如属性文件)。
  • src / test / java目录包含测试类。
  • src / test / resources目录包含测试资源。

我们构建的所有输出文件都在构建目录下创建 。 该目录包含与该博客文章相关的以下子目录(也有其他子目录,但以后我们将讨论它们):

  • classes目录包含已编译的.class文件。
  • libs目录包含由构建创建的jarwar文件。

让我们继续并将简单的主类添加到我们的项目中。

在我们的版本中添加主类

让我们创建一个简单的主类,该主类将单词“ Hello World”输出到System.outHelloWorld类的源代码如下所示:

package net.petrikainulainen.gradle;public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}
}

HelloWorld类已添加到src / main / java / net / petrikainulainen / gradle目录。

那很好。 但是,我们仍然必须编译和打包我们的项目。 让我们继续看一下Java项目的任务。

Java项目的任务

Java插件向我们的构建中添加了许多任务,但是与此博客文章相关的任务是:

  • 组装任务将编译应用程序的源代码并将其打包到jar文件中。 此任务不会运行单元测试。
  • 构建任务执行项目的完整构建。
  • clean任务删除构建目录。
  • compileJava任务编译我们应用程序的源代码。

我们还可以通过在命令提示符处运行以下命令来获取可运行任务及其描述的完整列表:

gradle tasks

这是获得我们的项目的简要概述的一种好方法,而无需阅读构建脚本。 如果在示例项目的根目录中运行此命令,则会看到以下输出:

> gradle tasks
:tasks------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.Help tasks
----------
dependencies - Displays all dependencies declared in root project 'first-java-project'.
dependencyInsight - Displays the insight into a specific dependency in root project 'first-java-project'.
help - Displays a help message
projects - Displays the sub-projects of root project 'first-java-project'.
properties - Displays the properties of root project 'first-java-project'.
tasks - Displays the tasks runnable from root project 'first-java-project'.Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.Rules
-----
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: clean<TaskName>: Cleans the output files of a task.To see all tasks and more detail, run with --all.BUILD SUCCESSFULTotal time: 2.792 secs

让我们继续前进,了解如何打包Java项目。

打包我们的Java项目

我们可以使用两个不同的任务来打包应用程序:

如果在命令提示符处运行命令gradle组装 ,我们将看到以下输出:

> gradle assemble
:compileJava
:processResources 
:classes
:jar
:assembleBUILD SUCCESSFULTotal time: 3.163 secs

如果在命令提示符处运行命令gradle build则将看到以下输出:

> gradle build
:compileJava
:processResources 
:classes
:jar
:assemble
:compileTestJava 
:processTestResources 
:testClasses 
:test 
:check 
:buildBUILD SUCCESSFULTotal time: 3.01 secs

这些命令的输出表明,这些任务的不同之处在于:

  • 组装任务仅运行打包我们的应用程序所需的任务。
  • 构建任务运行打包我们的应用程序所需的任务,并运行自动化测试。

这两个命令都将first-java-project.jar文件创建到build / libs目录。

通过使用以下模板创建创建的jar文件的默认名称: [项目名称] .jar ,并且该项目的默认名称与创建它的目录的名称相同。 因为我们的项目目录的名称是first-java-project ,所以创建的jar的名称是first-java-project.jar

现在,我们可以尝试使用以下命令来运行我们的应用程序:

java -jar first-java-project.jar

执行此操作时,将看到以下输出:

> java -jar first-java.project.jar
No main manifest attribute, in first-java-project.jar

问题是我们尚未在清单文件中配置jar文件的主类。 让我们找出如何解决这个问题。

配置jar文件的主类

Java插件向我们的项目添加了一个jar任务 ,每个jar对象都有一个manifest属性,该属性是Manifest的一个实例。

我们可以使用Manifest接口的attribute()方法配置创建的jar文件的主类。 换句话说,我们可以使用包含键值对的映射来指定添加到清单文件的属性。

我们可以通过设置Main-Class属性的值来设置应用程序的入口点。 在对build.gradle文件进行了必要的更改之后,其源代码如下所示(相关部分已突出显示):

apply plugin: 'java'jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'}
}

Java SE教程提供了有关清单文件的更多信息 。

通过运行gradle assemblegradle build命令创建新的jar文件之后,可以使用以下命令运行jar文件:

java -jar first-java-project.jar

当我们运行应用程序时,以下文本将打印到System.out

> java -jar first-java-project.jar
Hello World!

今天就这些。 让我们找出从这篇博客文章中学到的知识。

摘要

现在,我们使用Gradle创建了一个简单的Java项目。 这篇博客文章教会了我们四件事:

  • 我们知道可以通过应用Gradle Java插件来创建Java项目。
  • 我们了解到Java项目的默认目录布局与Maven项目的默认目录布局相同。
  • 我们了解到,可以从构建目录中找到由构建生成的所有输出文件。
  • 我们学习了如何自定义添加到清单文件的属性。

PS此博客文章的示例项目可在Github上获得 。

翻译自: https://www.javacodegeeks.com/2014/06/getting-started-with-gradle-our-first-java-project.html

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

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

相关文章

特征码弊端渐显 杀毒技术面临革命

一种观点认为&#xff0c;防病毒与安全供应商们在与网络罪犯们的战斗中正逐步失去主动。黑客们的网络爬虫正越来越多的偷偷潜入计算机&#xff0c;植入恶意程序&#xff0c;打开计算机发送远程攻击指令&#xff0c;并把它们变为僵尸网络的僵尸军团。 造成这个局面的根本原因在于…

《金字塔原理》读书笔记

第一篇 表达的逻辑 1.金字塔原理序文 人们希望达到的境界&#xff1a;想清楚、说明白、知道说什么、怎么说。 需要清楚3件事情&#xff1a; 谁是我的听众&#xff1f; 他们想听什么&#xff1f; 他们想怎么样听&#xff1f; 金字塔的基本原理 金字塔原理是一种重点突出、逻…

9 个鲜为人知的 Python 数据科学库

除了 pandas、scikit-learn 和 matplotlib&#xff0c;还要学习一些用 Python 进行数据科学的新技巧。Python 是一种令人惊叹的语言。事实上&#xff0c;它是世界上增长最快的编程语言之一。它一次又一次地证明了它在各个行业的开发者和数据科学者中的作用。Python 及其库的整个…

列出和过滤NIO.2中的目录内容

在Java 7发行之前&#xff0c;列出目录内容的领域并没有发生太多的事情。但是&#xff0c;由于NIO.2引入了一种新的方式来做到这一点&#xff0c;因此涵盖这一领域可能是值得的。 NIO.2的一大优点是能够在一个方法调用中立即使用列表和过滤。 这为与文件系统相关的大多数列表/筛…

Windows Mobile 编程 (Win32) - 获取设备能力

《Windows 程序设计》第五章重点讲述图形基础。首先一个示例代码是获取设备描述表信息。代码与Windows Mobile 编程 (Win32) - 输出文本中的代码类似。 #include <windows.h>#define NUMLINES ((int)(sizeof devcaps / sizeof devcaps[0]))struct {int iIndex;TCHAR …

Netty : writeAndFlush的线程安全及并发问题

使用Netty编程时&#xff0c;我们经常会从用户线程&#xff0c;而不是Netty线程池发起write操作&#xff0c;因为我们不能在netty的事件回调中做大量耗时操作。那么问题来了 – 1&#xff0c; writeAndFlush是线程安全的吗&#xff1f; 2&#xff0c; 是否使用了锁&#xff0c;…

[翻译-ASP.NET MVC]Contact Manager开发之旅

本翻译系列为asp.net mvc官方实例教程。在这个系列中&#xff0c;Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试、TDD、Ajax、软件设计原则及设计模式创建一个完整的Contact Manager应用。本系列共七个章节&#xff0c;也是七次迭代过程。本人将陆续对其进行…

数据库 日期格式操作

sql server: 日期转字符串-日期select CONVERT(varchar(100), GETDATE(), 23) from RegionRealtimeData 日期转字符串-全select CONVERT(varchar(100), GETDATE(), 20) from RegionRealtimeData 字符串转日期-日期select CONVERT(date, 2016-02-11, 23) from RegionRealtimeDat…

jsp输出所有请求头的名称

Enumeration headernamesrequest.getHeaderNames();while(headernames.hasMoreElements()){String headernameheadernames.nextElement();out.println(headername "-->" request.getHeader(headername) "");}out.println("");更多专业前端知识…

Spring4:具有Java 8 Date-Time API的@DateTimeFormat

在Spring 3.0中作为Formatter SPI的一部分引入的DateTimeFormat批注可用于解析和打印Web应用程序中的本地化字段值。 在Spring 4.0中&#xff0c; DateTimeFormat批注可以直接与Java 8 Date-Time API&#xff08; java.time &#xff09;一起使用。 在Spring中&#xff0c;可以…

一、rollup

参考&#xff1a;reduxreach-routerrollup-starter-librollup-starter-approller-clicreate-react-library 一、安装 npm install --global rollup二、命令&#xff1a; rollup -c 默认指向rollup.config.jsimport babel from rollup-plugin-babel; import commonjs from ro…

从一本书看经济危机中创业者的机会

最近抽时间在看一本书《赢道&#xff1a;成功创业者的28条戒律》&#xff0c;赢道营销总裁邓超明、中国企业家联合会秘书长刘洋和资深IT经理人代腾飞三位创业者联手所写。就如同网上所介绍的&#xff0c;这本书分析了近30年来国内外100位风云人物创业成败之道&#xff0c;讲述了…

JSF中run项目时候Tomcat8启动不了的一种方法

把另一个博客内容迁移到这 我的问题是Tomcat是可以启动的 但是run那个jsp的时候七月 10, 2016 3:14:54 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property source to org.eclipse…

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index.

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index. 这里是因为版本不匹配的问题 查看es版本方法如下&#xff1a; 查看elasticsearch包与elasticsearch-dsl版本方法&#xff08;pip list&#xff09;如下&#xff1a; 因为我的es是5.1…

ListView执行notifyDatasetChanged无数据显示,getView未执行

自定义的一个ListView放到布局文件中&#xff0c;设置widthmatch_parent&#xff0c;heightwrap_content。 设置数据后执行notifyDatasetChanged。可以确定数据发生了变化&#xff0c;但是没有进入到getView中刷新数据。 经过尝试&#xff0c;设置height为match_parent之后数据…

在Java中对Singleton类进行双重检查锁定

Singleton类在Java开发人员中非常常见&#xff0c;但是它给初级开发人员带来了许多挑战。 他们面临的主要挑战之一是如何使Singleton保持为Singleton&#xff1f; 也就是说&#xff0c;无论出于何种原因&#xff0c;如何防止单个实例的多个实例。 对Singleton进行双重检查锁定是…

【转】解析.Net框架下的XML编程技术

【引自突破思维的禁忌的博客】一、前言 XML是微软.Net战略的一个重要组成部分&#xff0c;而且它可谓是XML Web服务的基石&#xff0c;所以掌握.Net框架下的XML技术自然显得非常重要了。本文将指导大家如何运用C#语言完成.Net框架下的XML文档的读写操作。首先&#xff0c;我会向…

line-height 属性

p.small {line-height:90%} p.big {line-height:200%} 该属性会影响行框的布局。在应用到一个块级元素时&#xff0c;它定义了该元素中基线之间的最小距离而不是最大距离。 line-height 与 font-size 的计算值之差&#xff08;在 CSS 中成为“行间距”&#xff09;分为两半&…

wstngfw中使用Viscosity连接OpenV-P-N服务器

wstngfw中使用Viscosity连接OpenV-P-N服务器 在本例中&#xff0c;将假设以下设置&#xff1a; 站点 A站点 B名称Beijing Office&#xff08;北京办公室&#xff09;名称Shenzheng Office&#xff08;深圳办公室&#xff09;WAN IP192.168.10.46WAN IP192.168.20.46LAN 子网192…

软件开发薪资调查

软件开发薪资调查 以下是根据朋友和自己面试过的几家公司的了解得到的结果&#xff0c;可能与实际数据有些出入&#xff0c;只做参考。 2&#xff5e;3年工作经验的&#xff1a;杭州 公司名 公司性质 待遇 灵川 欧美&#xff08;英国…