本指南将引导您完成使用Gradle的Build Init插件生成新Java库的过程,该Java库可在其他JVM库和应用程序中使用。
你会建立什么
您将生成一个遵循Gradle约定的Java库。
创建一个类库项目
Gradle带有一个称为Build Init插件的内置插件。在Gradle用户手册中有记录。该插件提供了一个名为的任务init
,可以生成项目。该init
任务使用(也是内置的)wrapper
任务来创建Gradle包装器脚本gradlew
。
第一步是为新项目创建一个文件夹,并将目录更改为该文件夹。
$ mkdir demo
$ cd demo
运行初始化任务
在新项目目录中,运行init
任务并java-library
在出现提示时选择项目类型。对于其他问题,请按Enter键以使用默认值。
$ gradle init
> Task :wrapper
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 3
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):
> Task :init
Get more help with your project: https://docs.gradle.org/5.0/userguide/java_library_plugin.html
BUILD SUCCESSFUL
2 actionable tasks: 2 executed
如果您更喜欢Kotlin DSL,则可以选择kotlin
构建脚本DSL。
该init
任务首先运行wrapper
任务,然后生成gradlew
和gradlew.bat
包装脚本。然后,它使用以下结构创建新项目:
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│ └── java
│ └── demo
│ └── Library.java
└── test
└── java
└── demo
└── LibraryTest.java
- 包装文件的生成文件夹
- 默认Java源文件夹
- 默认的Java测试文件夹
现在,您已经具有一个简单的Java库项目所需的组件。
查看生成的项目文件
该设置文件已被大量注释,但只有一个活动行:
rootProject.name = "building-java-libraries"
- 这将分配根项目的名称。
生成的build.gradle
文件也有很多注释。活动部分在此处复制(请注意依赖项的版本号可能会在Gradle的更高版本中更新):
plugins {
id 'java-library'
}
repositories {
jcenter()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'junit:junit:4.12'
}
- 公共Bintray人工仓库
- 这是一个依赖关系的示例,该依赖关系已导出到使用者,也就是说可以在其编译类路径上找到。
- 这是一个依赖关系的示例,该依赖关系在内部使用,并且不会在其自己的编译类路径中暴露给使用者。
- JUnit测试库
构建脚本将添加java-library插件。这是java-base
插件的扩展,并添加了用于编译Java源代码的其他任务。
文件src/main/java/demo/Library.java
显示在这里:
package demo;
public class Library {
public boolean someLibraryMethod() {
return true;
}
}
生成的JUnit规范src/test/java/demo/LibraryTest.java
如下所示:
package demo;
import org.junit.Test;
import static org.junit.Assert.*;
public class LibraryTest {
@Test public void testSomeLibraryMethod() {
Library classUnderTest = new Library();
assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
}
}
生成的测试类具有单个JUnit 4测试。测试实例化Library
该类,调用该someLibraryMethod
方法,并检查返回的值是否为true。
组装类库JAR
要生成项目,请运行build
任务。您可以使用常规gradle
命令,但是当项目包含包装器脚本时,可以使用它来代替它。
$ ./gradlew build
> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes
> Task :jar
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
> Task :check
> Task :build
BUILD SUCCESSFUL
4 actionable tasks: 4 executed
- 第一次运行包装程序脚本gradlew时,可能会延迟下载gradle版本并将其本地存储在〜/ .gradle / wrapper / dists文件夹中。
第一次运行构建时,Gradle将检查~/.gradle
目录中缓存中是否已经具有JUnit库和其他列出的依赖项。如果没有,这些库将被下载并存储在那里。下次运行构建时,将使用缓存的版本。该build
任务将编译类,运行测试并生成测试报告。
您可以通过打开位于的HTML输出文件来查看测试报告build/reports/tests/test/index.html
。
示例报告如下所示:

您可以build/libs
在名称为的目录中找到新打包的JAR文件demo.jar
。通过运行以下命令来验证归档文件是否有效:
$ jar tf build/libs/demo.jar
META-INF/
META-INF/MANIFEST.MF
demo/
demo/Library.class
您应该看到所需的清单文件MANIFEST.MF
—和已编译的Library
类。
- 由于Gradle的java-library插件假定您的项目源按常规项目布局排列,因此无需在构建脚本中进行任何其他配置即可完成所有这些操作。您可以根据用户手册的要求自定义项目布局。
恭喜,您已经完成了创建Java库的第一步!现在,您可以根据自己的项目需求对其进行自定义。
自定义库JAR
您通常会希望JAR文件的名称包含库版本。可以通过version
在构建脚本中设置顶级属性来轻松实现,如下所示:
version = '0.1.0'
现在运行jar
任务:
$ ./gradlew jar
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
BUILD SUCCESSFUL
2 actionable tasks: 2 up-to-date
并注意生成的JAR文件build/libs/demo-0.1.0.jar
包含预期的版本。
另一个常见要求是自定义清单文件,通常是通过添加一个或多个属性来进行。通过配置jar
task,在清单文件中包含库名称和版本。在构建脚本的末尾添加以下内容:
jar {
manifest {
attributes('Implementation-Title': project.name,
'Implementation-Version': project.version)
}
}
要确认这些更改是否按预期工作,请jar
再次运行任务,这一次还要从JAR解压缩清单文件:
$ ./gradlew jar
$ jar xf build/libs/demo-0.1.0.jar META-INF/MANIFEST.MF
现在查看META-INF/MANIFEST.MF
文件的内容,您应该看到以下内容:
Manifest-Version: 1.0
Implementation-Title: building-java-libraries
Implementation-Version: 0.1.0
- 了解有关配置JAR的更多信息清单只是可以在jar任务上配置的许多属性之一。有关完整列表,请参见Gradle语言参考的Jar部分以及Gradle用户手册的Jar和创建档案部分。
现在,您可以尝试编译一些使用刚刚构建的库的Java代码来完成此练习。
添加API文档
该java-library
插件通过该javadoc
任务内置了对Java API文档工具的支持。
由Build Init插件生成的代码已经在Library.java
文件上添加了注释。修改注释以成为javadoc
标记。
/**
* This java source file was generated by the Gradle 'init' task.
*/
package demo;
public class Library {
public boolean someLibraryMethod() {
return true;
}
}
运行javadoc
任务。
$ ./gradlew javadoc
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :javadoc
BUILD SUCCESSFUL
2 actionable tasks: 1 executed, 1 up-to-date
您可以javadoc
通过打开位于的HTML文件来查看生成的文件build/docs/javadoc/index.html
。
摘要
而已!您现在已经成功构建了Java库项目,将其打包为JAR,并在单独的应用程序中使用了它。在此过程中,您已经学会了如何:
-
生成一个Java库
-
调整生成的
build.gradle
样本Java文件的结构 -
运行构建并查看测试报告
-
自定义JAR文件的名称及其清单的内容
-
生成API文档。