这篇教程的主要内容是讲解如何用Gradle编译和打包一个简单的Java项目。
该Java项目只有一个需求:我们的构建脚本必须创建一个可执行的Jar文件,换句话说,我们必须能够使用命令java -jar jarfile.jar 来运行我们的程序。我们来看一下如何满足这个需求。
创建一个Java项目
我们可以使用Java插件(译注:关于Gradle插件的定义,请查看第一篇教程)来创建一个Java项目,为了做到这点,我们需要把下面这段语句加入到build.gradle文件中:
1
|
apply plugin: 'java'
|
就是这样,现在我们已经创建了一个Java项目。Java插件会在我们的构建中添加一些新的约定(如默认的项目结构),新的任务,和新的属性。
让我们来快速地看一下默认的项目结构。
Java项目结构
默认的项目结构如下:
- src/main/java目录包含了项目的源代码。
- src/main/resources目录包含了项目的资源(如属性文件)。
- src/test/java目录包含了测试类。
- src/test/resources目录包含了测试资源。所有我们构建生成的文件都会在build目录下被创建,这个目录涵盖了以下的子目录,这些子目录我们会在这篇教程中提到,另外还有一些子目录我们会放在以后讲解。
- classes目录包含编译过的.class文件。
- libs目录包含构建生成的jar或war文件。
为构建加入一个主类(main class)
让我们创建一个简单的主类,在这个类中会打印一个“Hello world”然后System.out出来。这个HelloWorld类的源代码如下:
1
2
3
4
5
6
7
8
|
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插件在我们的构建中加入了很多任务,我们这篇教程涉及到的任务如下:
- assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。
- build任务会执行一个完整的项目构建。
- clean任务会删除构建目录。
- compileJava任务会编译程序中的源代码。
我们还可以执行以下命令得到一个可运行任务及其描述的完整列表
1
|
gradle tasks |
这是一个很好的方式,不需要阅读构建脚本,就能对你的项目进行大致的浏览,如果我们在项目根目录下运行这个命令,我们可以看到以下输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
> 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 SUCCESSFUL Total time : 2.792 secs
|
我们继续,下面要讲怎样打包我们的项目。
打包我们的项目
我们可以通过使用两个不同的任务来打包项目。
如果我们在命令提示符中执行命令gradle assemble,我们可以看到以下输出:
1
2
3
4
5
6
7
8
9
10
|
> gradle assemble :compileJava :processResources :classes :jar :assemble BUILD SUCCESSFUL Total time : 3.163 secs
|
如果我们在命令提示符中执行命令gradle build,我们可以看到以下输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
> gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses : test
:check :build BUILD SUCCESSFUL Total time : 3.01 secs
|
这些命令的输出表明了它们的区别:
- assemble任务仅仅执行项目打包所必须的任务集。
- build任务执行项目打包所必须的任务集,以及执行自动化测试。这两个命令都会在build/libs目录中创建一个file-java-project.jar文件。默认创建的Jar文件名称是由这个模版决定的:[projectname].jar,此外,项目的默认名称和其所处的目录名称是一致的。因此如果你的项目目录名称是first-java-project,那么创建的Jar文件名称就是first-java-project.jar。
现在,我们尝试使用以下命令运行我们的程序:
1
|
java -jar first-java-project.jar |
我们可以看到以下输出:
1
2
|
> java -jar first-java.project.jar No main manifest attribute, in first-java-project.jar
|
问题出在,我们没有在manifest文件中配置Jar文件的主类,让我们继续看看怎样解决这个问题。
配置Jar文件的主类
Java插件在我们的项目中加入了一个Jar任务,每一个Jar对象都一个manifest属性,这个属性是Manifest的一个实例。
我们可以对生成的Jar文件的主类进行配置,使用Manifest接口的attributes()方法。换句话说,我们可以使用一个包含键值对的map结构指定加入到manifest文件的属性集。
我们能够通过设置Main-Class属性的值,指定我们程序的入口点。在我们对build.gradle文件进行必要的改动后,代码如下:
1
2
3
4
5
6
7
|
apply plugin: 'java'
jar { manifest {
attributes 'Main-Class' : 'net.petrikainulainen.gradle.HelloWorld'
}
} |
(JavaSE教程提供了关于manifest文件的更多信息。)
在我们执行gradle assemble或gradle build命令生成一个新的jar文件之后,我们可以执行以下命令运行jar文件:
1
|
java -jar first-java-project.jar |
当我们运行程序时,System.out会打印出以下信息:
1
2
|
> java -jar first-java-project.jar Hello World! |
这就是我们今天所有的内容,我们看一下我们学到了什么。
总结
我们已经通过Gradle创建了一个简单的Java项目,这篇教程教会了我们四点:
- 我们了解了可以使用Gradle的Java插件创建一个Java项目。
- 我们知道了Java项目的默认结构和Maven项目的默认结构是一样的。
- 我们知道了构建所生成的所有文件都能在build目录下找到。
- 我们知道了我们可以自定义加入到manifest文件中的属性。
P.S. 这篇教程的示例代码可以在Github找到。
相关推荐
netty-with-gradle 带有 Gradle 构建系统和连续性能单元测试 (CPUT) 的... Gradle 入门:我们的第一个 Java 项目 Gradle 用户指南 幻灯片: Eclipse 插件: 图书: Gradle 超越基础 视频: Gradle善良:http:
安卓入门使用 Gradle 的入门 Android 项目先决条件要开发 Android 应用程序,您需要安装 Android SDK。如何创建 Android 应用程序此入门项目名称为Starter 。 它的域是com.example.starter 。 请重命名以适合您自己...
我将在git存储库中的每个步骤中进行检查Gradle构建文件我的第一个任务是就地获得一个简单的Gradle构建文件。 在,我对build.gradle文件有了一个很好的入门。 我添加样板Java构建/测试的东西,我的build.gradle看...
入门从GitHub克隆此项目,或下载并解压缩它的 。 首次调用顶级gradlew (* nix)或gradlew.bat (Windows)脚本时,Gradle构建工具将自动下载。 如果您想摆脱Gradle及其下载的所有内容,请删除<user>/.gradle 。...
SVRF的API使您可以使用第一个也是最大的搜索引擎为您的项目或应用程序增添更多的沉浸式体验。 我们使任何开发人员都能轻松地将高度身临其境的体验与各种应用程序融合在一起:虚拟现实,增强现实,混合现实,移动和...
第一次你必须初始化 gradle 包装器以确保指定的 gradle 版本。 > cd wildhare #### First install the specified wrapper > gradle wrapper #### to build the project > ./gradlew build #### to install the ...
虽然我无法访问该压缩包的具体内容,但可以提供一个一般性的概述,关于可能包含在此类项目中的资源类型:项目源代码:通常会包括Maven或Gradle格式的项目结构,含有Java源代码、配置文件和资源文件,这些都用于构建...
运行您的第一个应用程序,您应该执行以下3 个步骤: * Install Gradle * Create the Gradle script * Create the JPro configuration file * Run the app 第1步。 安装 Gradle Gradle 可以下载和安装。 第2步。 创建...
内容摘要:Kotlin视频教程、第1章 Kotlin简介、第2章 快速开始:HelloWorld、第3章 Kotlin语言基础、第4章 基本数据类型与类型系统、第5章 集合类、第6章 泛型、第7章 面向对象编程、第8章 函数式编程、第9章 轻量级...
个弹性日用于项目和/或学习课程 3 周基于团队的项目 三天冲刺(Scrum) 员工充当 Scrum 主管和产品负责人 每周细分 第 1 周 文件系统 变量、运算符、表达式、基本类型 条件句 字符串和文本处理常用表达* Git 和 ...
一般说明第1部分:测试设计和错误挑战请参考该软件包中的文件Part1 - Test design and bug.docx 。 第2部分:自动化挑战该存储库包含挑战的UI和API自动化测试用例。自动化挑战入门这些说明将为您提供在本地计算机上...
SpringInitializr Spring Initializr提供了一个可扩展的API来生成基于JVM的项目,并带有几种常见概念的实现: Java,Kotlin和Groovy的基本语言生成。 使用Apache Maven和Gradle的实现构建系统抽象。 .gitignore支持...
#第一天 Android Studio 包名称取自应用程序名称和域名 根据开发人员仪表板( )的数据,最低SDK设置为android版本15。 一个布局视图由一个活动处理。 作弊 视窗 代码格式:CTRL + ALT + L 打开文件: Gradle ...
简单的Java消息服务示例我发现JMS入门有点复杂。 甚至O'Reilly的“ Java Messaging Service”之类的好书也没有提供完整的项目示例。 在这里,我提供了第2章中的聊天示例,其中包含完整的构建系统和说明。建造生成...
本示例使用Gradle构建系统。 要构建此项目,请使用“ gradlew build”命令或在Android Studio中使用“导入项目”。 支持 Google+社区: : 堆栈溢出: : 鼓励使用补丁,可以通过分叉此项目并通过GitHub提交拉取...
Gradle Kotlin DSL转换器欢迎您!...请将该工具用作帮助程序,它是第一个资源,例如Android Studio的Java转换器到Kotlin的转换器:它虽然无法完美转换,但可以大大减少您在重复任务上花费的时间。 :laptop:入门脚本w
1个弹性工作日,从事项目和/或入门课程 3周的团队项目 三天冲刺(Scrum) 担任Scrum Master和产品所有者的员工 每周细目 第一周 文件系统 变量,运算符,表达式,基本类型 有条件的 字符串和文字处理常用表达* Git...
掌握等级 ... 第1章-入门 第2章-Gradle的Groovy要点 第3章-管理任务 第4章-插件管理 第5章-依赖管理 第6章-使用Gradle 第7章-持续集成 第8章-迁移 第9章-部署 第10章-使用Gradle构建Android应用程序
第一次运行可能需要一段时间,因为它会下载相应的依赖项。 默认情况下, gradle build .class 和 .jar 文件输出到存储库根目录中的build/目录。 要仅运行我们的测试,请运行gradle test 。 要查看一些闪烁的灯,...
第1步:将其添加到存储库末尾的root build.gradle中: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 步骤2.添加依赖关系: dependencies { compile '...