简介

之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构建java项目。今天本文将会详细的讲解如何在gradle中构建java项目。

构建java项目的两大插件

安装java项目的目的不同,构建java项目有两大插件,一个是application,表示构建的是java应用程序;一个是java-library,表示构建的是java库,供别的项目使用。

不管是构建应用程序还是java库,我们都可以很方便的使用gradle init来创新一个新的gradle项目:

$ gradle init

Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2 Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3 Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1 Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit 4) [1..4] Project name (default: demo):
Source package (default: demo): BUILD SUCCESSFUL
2 actionable tasks: 2 executed

application和library的不同之处在于第二步选择的不同。

两者在build.gradle中的不同在于plugins的不同,application的plugin是:

plugins {
id 'application'
}

而library的plugin是:

plugins {
id 'java-library'
}

还有一个不同之处是依赖的不同,先看一个application的依赖:

dependencies {
testImplementation 'junit:junit:4.13' implementation 'com.google.guava:guava:29.0-jre'
}

再看一个library的依赖:

dependencies {
testImplementation 'junit:junit:4.13' api 'org.apache.commons:commons-math3:3.6.1' implementation 'com.google.guava:guava:29.0-jre'
}

因为library是需要给第三方应用程序使用的,所以这里多了一个api的使用,api表示是第三方应用程序也需要依赖这个包,而implementation表示的是该包只是在这个项目内部被依赖。

在构建libary的时候,还可以自定义manifest的信息:

tasks.named('jar') {
manifest {
attributes('Implementation-Title': project.name,
'Implementation-Version': project.version)
}
}

上面的例子将会在META-INF/MANIFEST.MF生成:

Manifest-Version: 1.0
Implementation-Title: lib
Implementation-Version: 0.1.0

我们还可以指定编译的java版本号和lib的版本:

java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
} version = '1.2.1'

管理依赖

java的依赖一般都是jar包组成的library。和maven一样,我们在gradle中指定依赖需要指定依赖的名字和版本号,依赖的范围:是运行时依赖还是编译时依赖,还有一个重要的就是在哪里可以找到这个library。

前面两个属性我们可以在dependencies中找到,后面一个我们可以在repositories中找到,看一个例子:

repositories {
mavenCentral()
} dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}

还可以使用这种形式的maven:

repositories {
maven {
url "http://repo.mycompany.com/maven2"
}
}

或者Ivy:

repositories {
ivy {
url "http://repo.mycompany.com/repo"
}
}

甚至可以使用本地的local dir:

repositories {
flatDir {
dirs 'lib'
}
flatDir {
dirs 'lib1', 'lib2'
}
}

上面定义了一个mavenCentral的仓库,我们可以在这个仓库中去查找hibernate-core这个依赖的jar包。

在dependencies这一块,我们可以定义依赖包的工作范围:

  • compileOnly: 表示依赖包只被用来编译代码,并不用在程序的运行。

  • implementation:表示依赖包被用在编译和运行时。

  • runtimeOnly: 只在运行时使用。

  • testCompileOnly: 仅在test的编译时使用。

  • testImplementation:在test的编译和运行时使用。

  • testRuntimeOnly: 在test的运行时使用。

我们还可以添加动态的依赖:

dependencies {
implementation 'org.springframework:spring-web:5.+'
}

使用项目作为依赖:

dependencies {
implementation project(':shared')
}

编译代码

一般情况下你的源代码需要放在src/main/java 目录下,测试代码需要放在src/test/java下面。然后添加compileOnly 或者 implementation依赖,如果需要测试的话,添加testCompileOnly或者testImplementation依赖。

然后就可以运行compileJava和compileTestJava来编译代码了。

当然,如果你有自定义的源文件目录,也可以这样手动指定:

sourceSets {
main {
java {
srcDirs = ['src']
}
} test {
java {
srcDirs = ['test']
}
}
}

上面的代码中我们给srcDirs重新赋值了。如果我们只是想要在现有的代码路径上再添加一个新的路径,那么可以使用srcDir:

sourceSets {
main {
java {
srcDir 'thirdParty/src/main/java'
}
}
}

除了源代码的路径,我们还可以配置编译的参数,并指定编译的JDK版本号:

compileJava {
options.incremental = true
options.fork = true
options.failOnError = false
options.release = 7
}

注意,gradle必须要在JDK8以上才能运行,但是我们可以指定gradle去使用Java 6 或者 Java 7去编译源代码。

我们还可以指定预览版本的特性:

tasks.withType(JavaCompile) {
options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
jvmArgs += "--enable-preview"
}

管理resource

java除了源代码文件之外,还有一些resource文件,比如配置文件,图片文件,语言文件等等。我们需要将这些配置文件拷贝到特定的目标目录中。

默认情况下,gradle会拷贝src/[sourceSet]/resources 中的文件到目标文件夹中。

我们看一个复杂的拷贝动作:

task copyDocs(type: Copy) {
from 'src/main/doc'
into 'build/target/doc'
} //for Ant filter
import org.apache.tools.ant.filters.ReplaceTokens //for including in the copy task
def dataContent = copySpec {
from 'src/data'
include '*.data'
} task initConfig(type: Copy) {
from('src/main/config') {
include '**/*.properties'
include '**/*.xml'
filter(ReplaceTokens, tokens: [version: '2.3.1'])
}
from('src/main/config') {
exclude '**/*.properties', '**/*.xml'
}
from('src/main/languages') {
rename 'EN_US_(.*)', '$1'
}
into 'build/target/config'
exclude '**/*.bak' includeEmptyDirs = false with dataContent
}

打包和发布

我们可以根据不同的构建类型来打包对应的文件。比如对应java lib来说,我们可以同时上传源代码和java doc文件:

java {
withJavadocJar()
withSourcesJar()
}

比如说我们还可以打包成一个fat jar包:

plugins {
id 'java'
} version = '1.0.0' repositories {
mavenCentral()
} dependencies {
implementation 'commons-io:commons-io:2.6'
} task uberJar(type: Jar) {
archiveClassifier = 'uber' from sourceSets.main.output dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}

生成javadoc

gradle的java library插件有一个javadoc task,可以为java项目生成文档。它支持标准的javadoc,也支持其他类型的文档,比如说Asciidoc,我们看一个生成Asciidoc的例子:

configurations {
asciidoclet
} dependencies {
asciidoclet 'org.asciidoctor:asciidoclet:1.+'
} task configureJavadoc {
doLast {
javadoc {
options.doclet = 'org.asciidoctor.Asciidoclet'
options.docletpath = configurations.asciidoclet.files.toList()
}
}
} javadoc {
dependsOn configureJavadoc
}

本文已收录于 http://www.flydean.com/gradle-build-java-projects/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

在gradle中构建java项目的更多相关文章

  1. 使用 Gradle 构建 Java 项目

    使用 Gradle 构建 Java 项目 这个手册将通过一个简单的 Java 项目向大家介绍如何使用 Gradle 构建 Java 项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的 Jav ...

  2. Eclipse 中构建 Maven 项目的完整过程 - SpringBoot 项目

    进行以下步骤的前提是你已经安装好本地maven库和eclipse中的maven插件了(有的eclipse中已经集成了maven插件) 一.Maven项目的新建 1.鼠标右键---->New--- ...

  3. Java-Maven-Runoob:Maven 构建 Java 项目

    ylbtech-Java-Maven-Runoob:Maven 构建 Java 项目 1.返回顶部 1. Maven 构建 Java 项目 Maven 使用原型 archetype 插件创建项目.要创 ...

  4. maven构建java项目、web项目

    maven构建java项目.web项目 一.mvn构建web项目 1安装mvn(包括path) 2命令:mvn archetype:create -DgroupId=cn.edu.sdau.neat ...

  5. Eclipse中构建maven项目的两种方式

    Eclipse中构建maven项目的两种方式 方式一: 1.构建maven项目 1.1 新建meven项目,可在Other中找到maven文件夹 1.2 进入maven项目后,点击next 1.3 在 ...

  6. Jenkins中构建Testcomplete项目的方法介绍

    Jenkins的部署在上一篇随笔中已经和大家介绍了,下面我们介绍一下再Jenkins中构建testcomplete项目.我这里使用的是Testcomplete11,下面详细介绍一下构建步骤. 1.Je ...

  7. eclipse中 将java项目转换为web项目

    来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件,  ...

  8. 在IDEA中构建Tomcat项目流程

    在IDEA中构建Web项目流程 打开你的IDEA,跟着我走! 第一步:新建项目 第二步:找到Artifacts 点击绿色的+号,如图所示,点一下 这一步很关键,目的是设置输出格式为war包,如果你的项 ...

  9. 在eclipse中构建solr项目+添加core+整合mysql+添加中文分词器

    最近在研究solr,这里只记录一下eclipse中构建solr项目,添加core,整合mysql,添加中文分词器的过程. 版本信息:solr版本6.2.0+tomcat8+jdk1.8 推荐阅读:so ...

随机推荐

  1. SpringMVC听课笔记(七:Restful CRUD)

    这章貌似没有什么可讲的,可以看GitHub工程代码: https://github.com/heyboom/SpringMVC_Rest_CRUD

  2. CCF CSP 202009-2 风险人群筛查

    202009-2 风险人群筛查 题目背景 某地疫情爆发后,出于"应检尽检"的原则,我们想要通知所有近期经过改高危区域的居民参与核酸检测. 问题描述 想要找出经过高危区域的居民,分析 ...

  3. SpringBoot - 实现文件上传2(多文件上传、常用上传参数配置)

    在前文中我介绍了 Spring Boot 项目如何实现单文件上传,而多文件上传逻辑和单文件上传基本一致,下面通过样例进行演示. 多文件上传 1,代码编写 1)首先在 static 目录中创建一个 up ...

  4. Yacc使用优先级

    Yacc使用优先级 本示例是龙书4.9.2的示例,见图4-59. 和前一章一样,新建xUnit项目,用F#语言.起个名C4F59安装NuGet包: Install-Package FSharpComp ...

  5. UI自动化实战进阶后续

    前言 最近几天因为回老家的缘故,暂时没空学习和记录,好不容易抽空那就赶紧开始后面的实战. 前面我们已经基本完成了测试的框架,并且也有了PO设计模式,后面我们还缺少什么呢?做为自动化测试最主要的测试报告 ...

  6. Codeforces Global Round 11 C. The Hard Work of Paparazzi(dp/最长上升子序列)

    题目链接:https://codeforces.com/contest/1427/problem/C 题意 \(r\) 行与 \(r\) 列相交形成了 \(r \times r\) 个点,初始时刻记者 ...

  7. Codeforces Round #646 (Div. 2) 题解 (ABCDE)

    目录 A. Odd Selection B. Subsequence Hate C. Game On Leaves D. Guess The Maximums E. Tree Shuffling ht ...

  8. UVALive 7276 Wooden Signs

    详细题目见:http://7xjob4.com1.z0.glb.clouddn.com/0f10204481da21e62f8c145939e5828e 思路:记dp[i][j]表示第i个木板尾部在j ...

  9. js实现一棵树的生长

    参考链接:https://blog.csdn.net/u010298576/article/details/76609244 HTML网页源码: 1 <!DOCTYPE html> 2 & ...

  10. Codeforces Round #650 (Div. 3) F1. Flying Sort (Easy Version) (离散化,贪心)

    题意:有一组数,每次操作可以将某个数移到头部或者尾部,问最少操作多少次使得这组数非递减. 题解:先离散化将每个数映射为排序后所对应的位置,然后贪心,求最长连续子序列的长度,那么最少的操作次数一定为\( ...