应用构建
Java & JVM 应用构建
一个
plugins {
id 'java-library'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}
version = '1.2.1'
通过应用
- 一个
compileJava 任务,编译src/main/java
下的所有Java 源文件。 - 为
src/test/java
下的源文件制定的compileTestJava
任务 - 一个
test
任务,运行src/test/java
下的测试。 - 一个
jar 任务,将src/main/resources
下的main 编译的类和资源打包成一个名为<project>-<version>.jar
的JAR 。 - 一个
javadoc
任务,为main
类生成Javadoc 。
这并不足以构建任何非复杂的
Source sets
- 源文件和它们的位置
- 编译的
classpath ,包括任何必要的依赖关系 - 编译后的类文件的位置

阴影框代表
// Replaces conventional source code directory with list of different directories
sourceSets {
main {
java {
srcDirs = ['src']
}
}
// Replaces conventional test source code directory with list of different directories
test {
java {
srcDirs = ['test']
}
}
}
// Changes project output property to directory out
buildDir = 'out'
现在
sourceSets {
main {
java {
srcDir 'thirdParty/src/main/java'
}
}
}
我们也可以指定直接在项目根目录下存放源代码文件:
sourceSets {
main {
java {
srcDirs += ["$projectDir"]
srcDirs += ["$projectDir/cadex"]
}
}
}

像以前一样,阴影框代表
项目通常将这个
依赖管理
绝大多数的
- 你需要哪个依赖,例如名称和版本
- 需要它做什么,比如说编译或运行
- 在哪里可以找到它
前两个在依赖关系
repositories {
mavenCentral()
}
dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}
这三个要素的
- 仓库
" (例如: “mavenCentral()")–在那里可以找到你声明为依赖的模块 - 配置”(ex:
implementation
)–命名的依赖关系集合,为特定目标(如编译或运行模块)而分组–是Maven 作用域的更灵活形式 - 模块坐标
" (例如: org.hibernate:hibernate-core-3.6.7.Final
)–依赖关系的ID ,通常采用" <组>
: <模块>
: <版本>
“的形式(或Maven 术语中的”<组ID>
:<工件ID>
:<版本>
") 。
你可以找到一份更全面的依赖性管理术语表这里。
就配置而言,主要有以下几种。
compileOnly
–用于编译生产代码所需的依赖项,但不应该成为运行时classpath 的一部分。implementation
( 取代compile
) - 用于编译和运行时。runtimeOnly
( 取代runtime
) - 只在运行时使用,不用于编译testCompileOnly
- 与compileOnly
相同,只是用于测试。testImplementation
- 测试相当于implementation
。testRuntimeOnly
–相当于runtimeOnly
的测试。
编译

现在你可以构建你的项目了,
$ gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build
输出的每一行都表示一个可执行的任务,你可能注意到有一些任务标记为


在项目的根目录你可以找到一个
自定义属性
// Identifies project’sversion through a number scheme
version = 0.1
// Sets Java version compilation compatibility to 1.6
sourceCompatibility = 1.6
// Adds Main-Class header to JAR file’s manifest
jar {
manifest {
attributes 'Main-Class': 'com.manning.gia.todo.ToDoApp'
}
}
打包成
打包与发布
你如何打包并可能发布你的
java {
withJavadocJar()
withSourcesJar()
}
如果你想创建一个 “超级”(又称
plugins {
id 'java'
}
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'commons-io:commons-io:2.6'
}
tasks.register('uberJar', Jar) {
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
修改Jar 包元定义
Jar、
jar {
manifest {
attributes("Implementation-Title": "Gradle",
"Implementation-Version": archiveVersion)
}
}
您还可以创建
ext.sharedManifest = manifest {
attributes("Implementation-Title": "Gradle",
"Implementation-Version": version)
}
tasks.register('fooJar', Jar) {
manifest = project.manifest {
from sharedManifest
}
}
另一个可供您使用的选项是将舱单合并到一个舱单对象中。这些源清单的形式可以是文本,也可以是另一个
tasks.register('barJar', Jar) {
manifest {
attributes key1: 'value1'
from sharedManifest, 'src/config/basemanifest.txt'
from(['src/config/javabasemanifest.txt', 'src/config/libbasemanifest.txt']) {
eachEntry { details ->
if (details.baseValue != details.mergeValue) {
details.value = baseValue
}
if (details.key == 'foo') {
details.exclude()
}
}
}
}
}