Skip to content

Commit

Permalink
put readme.md
Browse files Browse the repository at this point in the history
  • Loading branch information
scwang90 committed Dec 17, 2018
1 parent aa30e78 commit 39c8823
Show file tree
Hide file tree
Showing 3 changed files with 260 additions and 20 deletions.
186 changes: 186 additions & 0 deletions artifact-management.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
# 打包和发布

## 介绍

这一章是关于如何声明项目的输出 artifacts (工件),以及如何使用它们(例如,上传)。我们将项目的 artifacts 定义为项目提供给外部世界的文件。这可能是一个库或ZIP发行版或任何其他文件。项目可以发布任意数量的artifacts。

## 配置

和 dependencies (依赖)一样,artifacts 页是任意配置的。其实一个配置可以同时包含 *依赖**工件*

Gradle只要添加了 [base plugin](https://docs.gradle.org/5.0/userguide/base_plugin.html#base_plugin) 插件,对于项目种的每个配置项,都提供了 `upload*ConfigurationName*``build*ConfigurationName*` 两个任务。 执行这些任务将会构建或上传属于各自配置的工件。

[这个列表](https://docs.gradle.org/5.0/userguide/java_plugin.html#tab:configurations) 种列出了 java plugin 添加的各项配置。其中两个配置与工件的使用相关。`arcgives` (归档)配置是分配工件的标准配置。java plugin 自动将默认 jar 分配给这个配置。我们将在后面进一步讨论 `runtime` 配置。与依赖项一样,你可以给工件分配声明任意多的自定义配置。

## 声明工件

### 归档任务(archive task)

你可以使用归档任务(archive task)来定义工件:

*例1. 使用归档任务定义工件*

**build.gradle Groovy 版本**
```groovy
task myJar(type: Jar)
artifacts {
archives myJar
}
```
**build.gradle.kts Kotlin 版本**
```groovy
val myJar = task<Jar>("myJar")
artifacts {
add("archives", myJar)
}
```

需要注意的是,自定义存档不会自动分配给任何配置。你必须明确地做这个指定。

### 文件工件

你还可以使用文件来定义工件:

*例2. 使用文件定义工件*

**build.gradle Groovy 版本**
```groovy
def someFile = file("$buildDir/somefile.txt")
artifacts {
archives someFile
}
```
**build.gradle.kts Kotlin 版本**
```groovy
val someFile = file("$buildDir/somefile.txt")
artifacts {
add("archives", someFile)
}
```

Gradle将根据文件的名称确定工件的属性。你可以自定义这些属性:

*例3. 自定义一个工件*

**build.gradle Groovy 版本**
```groovy
task myTask(type: MyTaskType) {
destFile = file("$buildDir/somefile.txt")
}
artifacts {
archives(myTask.destFile) {
name 'my-artifact'
type 'text'
builtBy myTask
}
}
```
**build.gradle.kts Kotlin 版本**
```groovy
val myTask = task<MyTaskType>("myTask") {
destFile = file("$buildDir/somefile.txt")
}
artifacts {
add("archives", myTask.destFile!!) {
name = "my-artifact"
type = "text"
builtBy(myTask)
}
}
```

有一个基于 map 的语法来定义一个工件。map 必须包含一个键 `file` 并对应一个文件实体。map 还可以包含其他的工件属性。


*例4. map语法定义工件*

**build.gradle Groovy 版本**
```groovy
task generate(type: MyTaskType) {
destFile = file("$buildDir/somefile.txt")
}
artifacts {
archives file: generate.destFile, name: 'my-artifact', type: 'text', builtBy: generate
}
```
**build.gradle.kts Kotlin 版本**
```groovy
val generate = task<MyTaskType>("generate") {
destFile = file("$buildDir/somefile.txt")
}
artifacts {
add("archives",
mapOf("file" to generate.destFile, "name" to "my-artifact", "type" to "text", "builtBy" to generate))
}
```

## 发布工件

我们已经说过,每个配置都有一个特定的上传任务。在进行上传之前,必须配置上传任务并定义将工件发布到何处。你定义的存储库(如 [声明存储库](https://docs.gradle.org/5.0/userguide/declaring_repositories.html#declaring_repositories) 中所述)不会自动用于上传。事实上,有些存储库只允许下载工件,而不允许上传。下面是一个如何配置配置的上传任务的例子:

*例5. 配置上传任务*

**build.gradle Groovy 版本**
```groovy
repositories {
flatDir {
name "fileRepo"
dirs "repo"
}
}
uploadArchives {
repositories {
add project.repositories.fileRepo
ivy {
credentials {
username "username"
password "pw"
}
url "http://repo.mycompany.com"
}
}
}
```
**build.gradle.kts Kotlin 版本**
```groovy
repositories {
flatDir {
name = "fileRepo"
dirs("repo")
}
}
tasks.getByName<Upload>("uploadArchives") {
repositories {
add(project.repositories["fileRepo"])
ivy {
credentials {
username = "username"
password = "pw"
}
url = uri("http://repo.mycompany.com")
}
}
}
```

正如你所看到的,你可以使用现有存储库,也可以创建一个新的存储库。

如果上传存储库定义了多个模式,Gradle为每个文件选择上传的模式。默认情况下,Gradle将上传到 `url` 参数定义的模式,并与可选的 `layout` (布局)参数相结合。如果没有提供 `url` 参数,那么Gradle将使用第一个定义的 `artifactPattern` 进行上传,或者使用第一个定义的 `ivyPattern` 上传Ivy文件。

如果需要上传到 Maven 请看 [这里]https://docs.gradle.org/5.0/userguide/maven_plugin.html#uploading_to_maven_repositories)。

## 更多关于项目 libraries 的资料

如果您的项目被假定为一个库,那么您需要定义这个库的工件是什么,以及这些工件的依赖关系是什么。Java插件为此目的添加了一个运行时配置,隐含的假设是运行时依赖项是要发布的工件的依赖项。当然,这是完全可定制的。您可以添加自己的自定义配置,或者让现有配置继承于其他配置。您可能拥有不同的工件组,这些工件组具有不同的依赖项集。这种机制非常强大和灵活。

如果有人想将您的项目用作库,她只需要声明依赖配置即可。Gradle提供了声明该依赖项的配置属性。如果没有指定,则使用默认配置(请参见 [管理依赖项配置](https://docs.gradle.org/5.0/userguide/managing_dependency_configurations.html#managing_dependency_configurations))。将项目用作库可以从多项目构建中进行,也可以从存储库中检索。在后一种情况下,需要使用 `ivy.xml` 来提供必要的信息。如果您使用Maven存储库,您就没有上面描述的灵活性。有关如何向Maven存储库发布,请参见 [向Maven存储库](https://docs.gradle.org/5.0/userguide/maven_plugin.html#uploading_to_maven_repositories) 上传一节。
89 changes: 70 additions & 19 deletions building-java-libraries.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 构建Java项目

本教程将指导您使用Gradle的 `Init` 插件来生成一个让能其他Jvm库或应用使用的Jvm库
本教程将指导您使用Gradle的 `Init` 插件来生成一个Jvm库

## 你要构建什么

Expand All @@ -26,7 +26,7 @@ $ cd building-java-libraries

## 运行 Init 任务

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

**If you prefer the Groovy DSL**
```
Expand Down Expand Up @@ -88,17 +88,17 @@ BUILD SUCCESSFUL in 0s
└── LibraryTest.java
```

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

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

## 检查生成的项目文件

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

**生成的 settings.gradle 文件 groocy 版本**
**生成的 settings.gradle 文件 Groovy 版本**
```
/*
* 这个文件是由Gradle 'init'任务生成的。
Expand All @@ -107,16 +107,16 @@ BUILD SUCCESSFUL in 0s
rootProject.name = 'building-java-libraries'
```

**生成的 settings.gradle 文件 kotlin 版本**
**生成的 settings.gradle.kts 文件 Kotlin 版本**
```
rootProject.name = "building-java-libraries"
```

> 这行代码指定了根项目的名称
生成的 *build.gradle* 文件也被大量注释了,下面是有效的代码副本
生成的 *build.gradle* 文件也被大量注释了,下面是有效的代码内容

**生成的 build.gradle 文件 groocy 版本**
**生成的 build.gradle 文件 Groovy 版本**
```
plugins {
id 'java-library'
Expand All @@ -138,7 +138,7 @@ dependencies {
}
```

**生成的 build.gradle 文件 kotlin 版本**
**生成的 build.gradle.kts 文件 Kotlin 版本**
```
plugins {
`java-library`
Expand All @@ -160,7 +160,7 @@ dependencies {
}
```

该构建脚本添加了 [java-libaray](https://docs.gradle.org/5.0/userguide/java_library_plugin.html) 插件。它扩展了`java-base` 插件并添加了编译Java源代码任务的。
该构建脚本添加了 [java-libaray](https://docs.gradle.org/5.0/userguide/java_library_plugin.html) 插件。它继承了`java-base` 插件并添加了编译Java源代码任务的。

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

Expand Down Expand Up @@ -193,9 +193,9 @@ public class LibraryTest {
}
```

生成的测试类有一个简单的 [JUnit 4] 测试。测试实例化 `libaray` 类,调用`someLibraryMethod`方法,并检查返回值是否为“true”。
生成的测试类有一个简单的 [JUnit 4](http://junit.org/junit4/) 测试。测试实例化 `libaray` 类,调用`someLibraryMethod`方法,并检查返回值是否为“true”。

## 打包为Jar
## 打成Jar包

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

Expand Down Expand Up @@ -246,11 +246,11 @@ Library.class

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

**build.gradle groovy版本**
**build.gradle Groovy 版本**
```java
version = '0.1.0'
```
**build.gradle kotlin版本**
**build.gradle.kts Kotlin 版本**
```java
version = "0.1.0"
```
Expand All @@ -259,7 +259,7 @@ version = "0.1.0"

另一个常见的需求是定制清单文件,通常是添加一个或多个属性。让我们 [配置jar任务](https://docs.gradle.org/5.0/userguide/more_about_tasks.html#sec:configuring_tasks) 在清单文件中包含库名和版本。在构建脚本的末尾添加以下内容:

**build.gradle groovy版本**
**build.gradle Groovy 版本**
```java
jar {
manifest {
Expand All @@ -268,7 +268,7 @@ jar {
}
}
```
**build.gradle kotlin版本**
**build.gradle.kts Kotlin 版本**
```java
tasks {
jar {
Expand All @@ -291,7 +291,7 @@ $ jar xf build/libs/building-java-libraries-0.1.0.jar META-INF/MANIFEST.MF

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

```js
```mf
Manifest-Version: 1.0
Implementation-Title: building-java-libraries
Implementation-Version: 0.1.0
Expand All @@ -300,5 +300,56 @@ Implementation-Version: 0.1.0
> **了解关于配置jar的更多信息**
> `manifest ` 只是jar任务上可以配置的许多属性之一。有关完整列表,请参见 [Gradle语言参考](https://docs.gradle.org/5.0/dsl/) 的 [Jar部分](https://docs.gradle.org/5.0/dsl/org.gradle.api.tasks.bundling.Jar.html) 以及 [Gradle用户手册](./use) 的 [Jar](https://docs.gradle.org/5.0/userguide/java_plugin.html#sec:jar) 和 [创建归档](https://docs.gradle.org/5.0/userguide/working_with_files.html#sec:archives) 部分。

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

## 添加API文档

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

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

**src/main/java/Library.java**
```java
package jvm.library;

public class Library {
public boolean someLibraryMethod() {
return true;
}
}
```

运行 `javadoc` 任务.

```bat
$ ./gradlew javadoc
> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes
> Task :javadoc
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
```

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

## 总结

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

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

## 下一步

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

- [使用JVM库](https://docs.gradle.org/5.0/userguide/artifact_dependencies_tutorial.html)
- [发布JVM库](.//artifact-management.md)
- [处理多项目构建](https://docs.gradle.org/5.0/userguide/intro_multi_project_builds.html)

5 changes: 4 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@
- [课程介绍](./userguide.md)
- [下载安装](./installation.md)
- [入门指南](./getting-started.md)
- [创建新的Gradle项目](./creating-new-gradle-builds.md)
- [教程和手册](./tutorials-guides.md)
- [创建新的Gradle项目](./creating-new-gradle-builds.md)
- [创建Java库项目](./building-java-libraries.md)
- [打包并发布](./artiface-management.md)

0 comments on commit 39c8823

Please sign in to comment.