构建Java项目

本教程将指导您使用Gradle的 Init 插件来生成一个Jvm库。

你要构建什么

您将生成具有标准布局的Java库

你需要什么

  • 大约11分钟
  • 文本编辑器或者 IDE (集成开发环境)
  • Java运行时环境(JRE)或Java Development Kit(JDK),版本1.8或更高版本(仅运行Gradle时需要)
  • Gradle分发版,版本 5.0 或 更高版本

创建一个库项目

Gradle 自带了一个 Init 插件。它的文档在这里Gradle用户手册。它有一个叫做 init 的任务,可以用来生成项目。init 任务会去调用 wrapper 任务来创建 Gradle Wrapper 脚本 gradlew

第一步是为新项目创建一个文件夹,并将目录进入该文件夹。

  1. $ mkdir building-java-libraries
  2. $ cd building-java-libraries

运行 Init 任务

在新目录中,使用 java-library 参数运行 init 任务。

If you prefer the Groovy DSL

  1. $ gradle init --type java-library --project-name jvm-library
  2. > Task :wrapper
  3. > Task :init
  4. BUILD SUCCESSFUL in 4s
  5. 2 actionable tasks: 2 executed

If you prefer the Kotlin DSL

  1. $ gradle init --type java-library --project-name jvm-library --dsl kotlin
  2. > Task :wrapper
  3. > Task :init
  4. BUILD SUCCESSFUL in 0s
  5. 2 actionable tasks: 2 executed

init 任务首先执行 wrapper 任务来生成 gradlewgradlew.bat wrapper(包装器)脚本。然后创根据下面的结构来创建项目。

Groovy DSL

  1. .
  2. ├── build.gradle
  3. ├── gradle
  4. └── wrapper
  5. ├── gradle-wrapper.jar
  6. └── gradle-wrapper.properties
  7. ├── gradlew
  8. ├── gradlew.bat
  9. ├── settings.gradle
  10. └── src
  11. ├── main
  12. └── java
  13. └── Library.java
  14. └── test
  15. └── java
  16. └── LibraryTest.java

Kotlin DSL

  1. ├── build.gradle.kts
  2. ├── gradle
  3. └── wrapper
  4. ├── gradle-wrapper.jar
  5. └── gradle-wrapper.properties
  6. ├── gradlew
  7. ├── gradlew.bat
  8. ├── settings.gradle.kts
  9. └── src
  10. ├── main
  11. └── java
  12. └── Library.java
  13. └── test
  14. └── java
  15. └── LibraryTest.java

wrapper wrapper(包装器)文件的文件夹
main/java Java源文件文件夹
test/java Java测试文件夹

现在您已经拥有了一个简单Java库项目所需的组件。

检查生成的项目文件

生成的 settings.gradle (设置文件)添加了很多的注释,但只有一行是有效的:

生成的 settings.gradle 文件 Groovy 版本

  1. /*
  2. * 这个文件是由Gradle 'init'任务生成的。
  3. * 设置文件用于指定在根项目中包含哪些子项目。
  4. */
  5. rootProject.name = 'building-java-libraries'

生成的 settings.gradle.kts 文件 Kotlin 版本

  1. rootProject.name = "building-java-libraries"

这行代码指定了根项目的名称

生成的 build.gradle 文件也被大量注释了,下面是有效的代码内容:

生成的 build.gradle 文件 Groovy 版本

  1. plugins {
  2. id 'java-library'
  3. }
  4. repositories {
  5. jcenter() //指定依赖仓库
  6. }
  7. dependencies {
  8. //这是一个将依赖项导出到使用者的示例,也就是说在使用者的编译类路径中找到依赖项。
  9. api 'org.apache.commons:commons-math3:3.6.1'
  10. //这是一个内部使用的依赖项示例,它没有在自己的编译类路径上公开给使用者。
  11. implementation 'com.google.guava:guava:26.0-jre'
  12. //JUnit测试库
  13. testImplementation 'junit:junit:4.12'
  14. }

生成的 build.gradle.kts 文件 Kotlin 版本

  1. plugins {
  2. `java-library`
  3. }
  4. repositories {
  5. jcenter()
  6. }
  7. dependencies {
  8. //这是一个将依赖项导出到使用者的示例,也就是说在使用者的编译类路径中找到依赖项。
  9. api("org.apache.commons:commons-math3:3.6.1")
  10. //这是一个内部使用的依赖项示例,它没有在自己的编译类路径上公开给使用者。
  11. implementation("com.google.guava:guava:26.0-jre")
  12. //JUnit测试库
  13. testImplementation("junit:junit:4.12")
  14. }

该构建脚本添加了 java-libaray 插件。它继承了java-base 插件并添加了编译Java源代码任务的。

这是 src/main/java/jvm/library/Library.java 的内容。

生成的 src/main/java/Library.java

  1. package jvm.library;
  2. public class Library {
  3. public boolean someLibraryMethod() {
  4. return true;
  5. }
  6. }

生成的JUnit规范, src/test/java/jvm/library/LibraryTest.java 的内容。

生成的 Generated src/test/java/LibraryTest.java

  1. package jvm.library;
  2. import org.junit.Test;
  3. import static org.junit.Assert.*;
  4. public class LibraryTest {
  5. @Test public void testSomeLibraryMethod() {
  6. Library classUnderTest = new Library();
  7. assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
  8. }
  9. }

生成的测试类有一个简单的 JUnit 4 测试。测试实例化 libaray 类,调用someLibraryMethod方法,并检查返回值是否为“true”。

打成Jar包

构建项目,只需要运行 build 任务。你可以使用全局的 gradle 命令,但是当一个项目包含了 wrapper (包装器) 脚本。建议使用 gradlew 命令比较好。

  1. $ ./gradlew build
  2. > Task :compileJava
  3. > Task :processResources NO-SOURCE
  4. > Task :classes
  5. > Task :jar
  6. > Task :assemble
  7. > Task :compileTestJava
  8. > Task :processTestResources NO-SOURCE
  9. > Task :testClasses
  10. > Task :test
  11. > Task :check
  12. > Task :build
  13. BUILD SUCCESSFUL in 9s
  14. 4 actionable tasks: 4 executed

你第一次运行 wrapper 脚本的时候,gradlew 也许会有一段延时,它会去下载指定的 gradle 版本到本地文件夹 ~/.gradle/wrapper/dists

第一次运行 build 的时候,Gradle会去检查您你的 ~/.gradle 目录是否已经有了 Junit 的库和其他的依赖库缓。如果没有,将会下载并缓存到该目录。在你下次运行 build 的时候,这个缓存将会直接被使用而不用重新下载。build 任务会编译源文件,运行测试,生成测试报告。

你可以在 build/reports/tests/test/index.html 查看HTML格式的测试报告。

下面是一个简单的报告截图:

构建Java项目 - 图1

你可以在 build/libs 目录中找到生成名为 building-java-libraries.jar 的 Jar 包文件。可以输入下面的命令来验证 jar 文件是否有效。

  1. $ jar tf build/libs/building-java-libraries.jar
  2. META-INF/
  3. META-INF/MANIFEST.MF
  4. Library.class

你会看到必须的文件清单 —MANIFEST.MF— 和编译完成的 Library 类。

所有这些都不需要在构建脚本中进行任何额外的配置,因为 Gradle 的 java-library 插件假定您的项目源安排在 传统的项目 布局中。如果您愿意,可以按照用户手册中的描述 自定义项目布局

恭喜您,您刚刚完成了创建Java库的第一步!您现在可以根据您自己的项目需要对其进行自定义了。

自定义 Jar 配置

你可能最需要的是指定 Jar 文件的 版本。这个在构建脚本中使用顶级 version (版本)属性很容易实现,如下:

build.gradle Groovy 版本

  1. version = '0.1.0'

build.gradle.kts Kotlin 版本

  1. version = "0.1.0"

注意,生成的JAR文件位于 build/libs/build-java-libraries-0.1.0。jar 包含预期的版本。

另一个常见的需求是定制清单文件,通常是添加一个或多个属性。让我们 配置jar任务 在清单文件中包含库名和版本。在构建脚本的末尾添加以下内容:

build.gradle Groovy 版本

  1. jar {
  2. manifest {
  3. attributes('Implementation-Title': project.name,
  4. 'Implementation-Version': project.version)
  5. }
  6. }

build.gradle.kts Kotlin 版本

  1. tasks {
  2. jar {
  3. manifest {
  4. attributes(
  5. mapOf("Implementation-Title" to project.name,
  6. "Implementation-Version" to project.version)
  7. )
  8. }
  9. }
  10. }

确认这些更改按生效,需要再次运行jar任务,这一次还将从jar中解包清单文件:

  1. $ ./gradlew jar
  2. $ jar xf build/libs/building-java-libraries-0.1.0.jar META-INF/MANIFEST.MF

现在查看 META-INF/MANIFEST.MF 的内容如下:

  1. Manifest-Version: 1.0
  2. Implementation-Title: building-java-libraries
  3. Implementation-Version: 0.1.0

了解关于配置jar的更多信息
manifest 只是jar任务上可以配置的许多属性之一。有关完整列表,请参见 Gradle语言参考Jar部分 以及 Gradle用户手册Jar创建归档 部分。

现在,您可以通过尝试编译一些使用刚构建的库的Java代码来完成这个练习。

添加API文档

java-library 插件可以通过 javadoc 任务来支持Java的API文档工具。

Build Init插件生成的代码已经对 Library.java 文件进行了注释。将注释修改为 javadoc 标记。

src/main/java/Library.java

  1. package jvm.library;
  2. public class Library {
  3. public boolean someLibraryMethod() {
  4. return true;
  5. }
  6. }

运行 javadoc 任务.

  1. $ ./gradlew javadoc
  2. > Task :compileJava
  3. > Task :processResources NO-SOURCE
  4. > Task :classes
  5. > Task :javadoc
  6. BUILD SUCCESSFUL in 1s
  7. 2 actionable tasks: 2 executed

你可以在 build/docs/javadoc/index.html 找到 javadoc 生产的HTML文件。

总结

就是这样!现在您已经成功地构建了Java库项目,将其打包为JAR并在单独的应用程序中使用它。一路上,你学会了如何:

  • 生成Java库
  • 调整生成的 build.gradle 和示例结构化的Java文件
  • 运行构建并查看测试报告
  • 自定义JAR文件的名称及其清单的内容
  • 生成API文档。

下一步

构建库只是跨项目重用代码的一个方面。你可能还会感兴趣: