前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在gradle中构建java项目

在gradle中构建java项目

作者头像
子润先生
修改于 2021-06-21 03:22:59
修改于 2021-06-21 03:22:59
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

简介

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

构建java项目的两大插件

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plugins {
    id 'application' 
}

而library的plugin是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plugins {
    id 'java-library' 
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    testImplementation 'junit:junit:4.13' 

    implementation 'com.google.guava:guava:29.0-jre' 
}

再看一个library的依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tasks.named('jar') {
    manifest {
        attributes('Implementation-Title': project.name,
                   'Implementation-Version': project.version)
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Manifest-Version: 1.0
Implementation-Title: lib
Implementation-Version: 0.1.0

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

version = '1.2.1'

管理依赖

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}

或者Ivy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
repositories {
    flatDir {
        dirs 'lib'
    }
    flatDir {
        dirs 'lib1', 'lib2'
    }
}

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

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

  • compileOnly: 表示依赖包只被用来编译代码,并不用在程序的运行。
  • implementation:表示依赖包被用在编译和运行时。
  • runtimeOnly: 只在运行时使用。
  • testCompileOnly: 仅在test的编译时使用。
  • testImplementation:在test的编译和运行时使用。
  • testRuntimeOnly: 在test的运行时使用。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    implementation 'org.springframework:spring-web:5.+'
}

使用项目作为依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    implementation project(':shared')
}

编译代码

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sourceSets {
    main {
         java {
            srcDirs = ['src']
         }
    }

    test {
        java {
            srcDirs = ['test']
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sourceSets {
    main {
        java {
            srcDir 'thirdParty/src/main/java'
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compileJava {
    options.incremental = true
    options.fork = true
    options.failOnError = false
    options.release = 7
}

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 中的文件到目标文件夹中。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java {
    withJavadocJar()
    withSourcesJar()
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
多个语言项目发布JCenter仓库的小结
我在 JCenter 上发布过 Java、Android、Kotlin 的项目已经有数十个了。踩坑无数,所以写下这篇文章,作为记录和总结。
fengzhizi715
2018/08/24
7230
多个语言项目发布JCenter仓库的小结
Gradle Java 插件
Java 插件是构建 JVM 项目的基础,它为项目增加了很多能力,例如编译,测试,打包,发布等等。 很多插件都是基于 Java 插件实现的,例如 Android 插件。
佛系编码
2019/12/11
1.4K0
Gradle Java 插件
Gradle基础操作一
使用 Project.file(java.lang.Object)方法,通过指定文件的相对路径或绝对路径来对文件的操作,其中相对路径为相对当前project[根project 或者子project]的目录。其实使用Project.file(java.lang.Object)方法创建的 File 对象就是 Java 中的 File 对象,我们可以使用它就像在 Java 中使用一样。示例代码如下:
@派大星
2023/06/28
3790
Gradle基础操作一
gradle构建android项目详解
1、用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了。 根目录下面的settings.gradle当中主要是用来include子模块的,比如我
xiangzhihong
2018/02/01
2.3K0
gradle构建android项目详解
Android Studio之gradle的配置与介绍
Android Studio之gradle的配置与介绍 非著名程序员 1、gradle的简单介绍 Gradle是可以用于Android开发的新一代的Build System,也是Android Studio默认的build工具。其实Gradle脚本是基于一种JVM语言— Groovy,再加上DSL组成的。由于Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对Android开发的插件,比如标准Gradle之外的一些新的方法(Method)、闭包(Closure)等等。通过我们
非著名程序员
2018/02/01
1.9K0
Gradle 创建java项目详细步骤
Ant历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地.
louiezhou001
2019/07/25
1.2K0
Android如何通过Gradle发布java依赖库(jar)到 jitpack 公共仓库(—)
作为一个码农,我们开发了很多项目,也积累了很多自己的通用依赖库,这些都是我们的项目积累,那么我们该如将自己的依赖库方便的集成到以后的项目开发中,或者共享给比人使用呢?
聚优云惠
2022/08/19
1.3K0
快速构建第一个Flink工程
在安装好Flink以后,只要快速构建Flink工程,并完成相关代码开发,就可以轻松入手Flink。
大数据流动
2019/09/11
1.9K0
快速构建第一个Flink工程
Gradle发布maven到jcenter, 并构建自己的企业Maven私服
Andorid开发者经常会看到xx公司发布了xx项目,xx公司提供了gradle配置路径,我们就能轻松的使用它们的项目到自己的工程中:
开发者技术前线
2020/11/23
1.2K0
Gradle发布maven到jcenter, 并构建自己的企业Maven私服
Android:发布aar包到maven仓库以及 maven插件 和 maven-publish 插件的区别
在日常开发中,不可避免的需要把自己的 library 发布到 maven 仓库中,这样使用起来也更加方便。
分你一些日落
2021/12/06
4.5K0
Android:发布aar包到maven仓库以及 maven插件 和 maven-publish 插件的区别
【Android Gradle 插件】自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★
在 " Create New Module " 对话框中 , 选择 创建 " Java or Kotlin Library " 类型的依赖库 ;
韩曙亮
2023/03/30
1.5K0
【Android Gradle 插件】自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★
Gradle Plugin for Android Development User Guide 1
Gradle Plugin for Android Development User Guide (1)
宅男潇涧
2018/08/01
8600
Gradle Plugin for Android Development User Guide 1
Android 开发必备知识:我和 Gradle 有个约会
0、讲个故事 0.1 Ant,我还真以为你是只蚂蚁 真正开始近距离接触编程其实是在2012年,年底的时候带我的大哥说,咱们这个 app 发布的时候手动构建耗时太久,研究一下 ant 脚本吧。 那个时候连 HashMap 都不知道是啥,可想开发经验几乎为零,一个小小的 ant 脚本看得我真是深深地感受到了这个世界充满的恶意。好在后来硬着头皮搞明白了什么 target 之类的鬼东西,不然就没有然后了。 0.2 Maven,你们真的会读这个单词么 Maven /`meivn/ 接触 Maven,完全是因为读陈雄华
腾讯Bugly
2018/03/22
9160
Android 开发必备知识:我和 Gradle 有个约会
Gradle+Groovy基础篇
在Java项目中,有两个主要的构建系统:Gradle和Maven。构建系统主要管理潜在的复杂依赖关系并正确编译项目。还可以将已编译的项目以及所有资源和源文件打包到.war或.jar文件中。对于简单的构建,Maven和Gradle之间的选择几乎是个人喜好之一,或者也许是公司CTO或技术经理的偏好。他们俩都是非常好的构建工具。但是,对于更复杂的项目,Gradle比Maven更胜一筹。
FunTester
2019/12/17
2.1K0
gradle中的build script详解
build.gradle是gradle中非常重要的一个文件,因为它描述了gradle中可以运行的任务,今天本文将会带大家体验一下如何创建一个build.gradle文件和如何编写其中的内容。
程序那些事
2021/02/13
1.2K0
杂篇:一代版本一代神[-Gradle-]
零、前言 本文主要包括: |---Gradle简介,下载,安装 |---Groovy语言的简单认识 |---Gradle构建java项目 |---Gradle构建脚本的书写 |---Gradle构建j
张风捷特烈
2019/03/04
1.2K0
杂篇:一代版本一代神[-Gradle-]
Android library快速构建上传jcenter
compile 'com.android.support:appcompat-v7:25.2.0'
先知先觉
2019/01/21
8980
工具篇 | Gradle入门与使用指南 - 附Github仓库地址
Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写,该语言是用Groovy编写的,使得构建脚本更加简洁和强大。Gradle不仅可以构建Java应用程序,还支持多种语言和技术,例如C++、Python、Android等。
kfaino
2023/09/26
3.5K0
工具篇 | Gradle入门与使用指南 - 附Github仓库地址
将Gradle项目发布到Jcenter和Maven Central
Jcenter和Maven Central 为了方便我们理解Android studio是如何帮助我们获取开源库的,我们需要理清几个概念。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和 Maven Central。 jcenter jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。 我们在项目的build.gradle
xiangzhihong
2018/02/05
3.1K0
将Gradle项目发布到Jcenter和Maven Central
Gradle Kotlin DSL指南
Gradle的Kotlin DSL提供了一种替代传统Groovy DSL的语法,它在受支持的ide中增强了编辑体验,具有更好的内容辅助、重构、文档等功能。本章详细介绍了主要的Kotlin DSL结构,以及如何使用它与Gradle API进行交互。
从大数据到人工智能
2022/01/19
10.5K0
Gradle Kotlin DSL指南
相关推荐
多个语言项目发布JCenter仓库的小结
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文