Javadoc 简介

更新于 2025-12-30

baeldung 2024-05-11

1. 概述

良好的 API 文档是决定软件项目整体成功的重要因素之一。

幸运的是,所有现代版本的 JDK 都提供了 Javadoc 工具,可以从源代码中的注释自动生成 API 文档。

前提条件:

  • JDK 1.4(推荐使用 JDK 7 或更高版本,以兼容最新版的 Maven Javadoc 插件)
  • 将 JDK 的 /bin 目录添加到 PATH 环境变量中
  • (可选)配备内置工具的集成开发环境(IDE)

2. Javadoc 注释

我们从注释开始说起。

Javadoc 注释的结构看起来与普通的多行注释非常相似,但关键区别在于开头多了一个星号:

// 这是一行单行注释

/*
 * 这是一个普通的多行注释
 */

/**
 * 这是一个 Javadoc 注释
 */

Javadoc 风格的注释可以包含 HTML 标签。

2.1 Javadoc 格式

Javadoc 注释可以放在任何需要文档化的类、方法或字段上方。

这些注释通常由两个部分组成:

  • 对所注释内容的描述
  • 独立的块标签(以 “@” 符号开头),用于描述特定的元数据

在示例中,我们将使用一些常见的块标签。完整的块标签列表请参阅官方参考指南。

2.2 类级别的 Javadoc

让我们看看一个类级别的 Javadoc 注释是什么样子:

/**
 * Hero 是我们将要使用的主要实体……
 *
 * 请参见 {@link com.msm.javadoc.Person} 类以了解真实身份。
 * @author 美国队长
 */
public class SuperHero extends Person {
    // 字段和方法
}

这里包含一个简短的描述以及两种不同类型的块标签:独立标签和内联标签:

  • 独立标签 出现在描述之后,标签作为一行的第一个词,例如 @author
  • 内联标签 可以出现在任意位置,并用大括号包围,例如描述中的 @link 标签

在本例中,我们还看到了两种块标签的用法:

  • {@link} 提供对源代码中引用部分的内联链接
  • @author 表示添加该类、方法或字段的作者姓名

2.3 字段级别的 Javadoc

我们也可以在 SuperHero 类内部使用不带任何块标签的描述:

/**
 * 英雄广为人知的公开名称
 */
private String heroName;

除非显式地向 Javadoc 命令传递 -private 选项,否则不会为私有字段生成 Javadoc。

2.4 方法级别的 Javadoc

方法可以包含多种 Javadoc 块标签。

让我们看一下下面这个方法:

/**
 * <p>这是对该方法的简单描述……
 * <a href="http://www.supermanisthegreatest.com">超人!</a>
 * </p>
 * @param incomingDamage 所受到的伤害值
 * @return 英雄在攻击后剩余的生命值
 * @see <a href="http://www.link_to_jira/HERO-402">HERO-402</a>
 * @since 1.0
 */
public int successfullyAttacked(int incomingDamage) {
    // 具体实现
    return 0;
}

successfullyAttacked 方法既包含描述,也包含多个独立的块标签。

Javadoc 提供了大量块标签来帮助生成完善的文档,我们可以包含各种信息,甚至可以在注释中使用基本的 HTML 标签。

下面我们回顾一下上面示例中遇到的标签:

  • @param:提供关于方法参数的有用描述
  • @return:描述方法将返回或可能返回的内容
  • @see:生成类似于 {@link} 的链接,但更侧重于作为参考资料而非内联使用
  • @since:指定该类、字段或方法是在哪个版本中加入项目的
  • @version:指定软件版本,通常与 %I%%G% 宏一起使用
  • @throws:进一步说明在哪些情况下会抛出异常
  • @deprecated:解释为何弃用某段代码、何时弃用,以及替代方案是什么

虽然这两个部分在技术上都是可选的,但至少需要提供其中之一,Javadoc 工具才能生成有意义的内容。

3. Javadoc 生成

为了生成 Javadoc 页面,我们需要了解 JDK 自带的命令行工具以及 Maven 插件。

3.1 Javadoc 命令行工具

Javadoc 命令行工具功能强大,但也相对复杂。

如果直接运行 javadoc 命令而不带任何选项或参数,将会报错并输出它期望的参数列表。

我们至少需要指定要为其生成文档的包或类。

打开命令行并导航到项目目录。假设所有类都位于项目目录下的 src 文件夹中:

user@msm:~$ javadoc -d doc src\*

这将在名为 doc 的目录中生成文档(通过 -d 参数指定)。如果存在多个包或文件,则需要全部列出。

当然,使用具备内置功能的 IDE 会更加简便,通常也更推荐这种方式。

3.2 使用 Maven Javadoc 插件

我们也可以使用 Maven Javadoc 插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <tags>
            ...
            </tags>
        </plugin>
    </plugins>
</build>

在项目根目录下,运行以下命令即可在 target/site 目录中生成 Javadoc:

user@msm:~$ mvn javadoc:javadoc

Maven 插件功能非常强大,能够无缝处理复杂的文档生成任务。

可以看到 SuperHero 类继承关系的树状视图,以及我们的描述、字段和方法,还可以点击链接查看更多信息。

3.3 自定义 Javadoc 标签

除了使用预定义的块标签外,我们还可以创建自定义块标签。只需在 Javadoc 命令行中使用 -tag 选项,格式为 <标签名>:<允许的位置>:<标题>

例如,若要创建一个名为 @location 的自定义标签(允许在任意位置使用),并在生成的文档中显示为“Notable Locations”(著名地点)标题,可以运行如下命令:

user@msm:~$ javadoc -tag location:a:"Notable Locations:" -d doc src\*

然后在 Javadoc 注释的块部分使用该标签:

/**
 * 这是一个示例……
 * @location 纽约
 * @returns blah blah
 */

Maven Javadoc 插件也足够灵活,允许我们在 pom.xml 中定义自定义标签。

为了在项目中设置上述相同的标签,可以在插件的 <tags> 部分添加如下配置:

...
<tags>
    <tag>
        <name>location</name>
        <placement>a</placement>
        <head>Notable Places:</head>
    </tag> 
</tags>
...

这样就可以一次性定义自定义标签,而无需每次重复指定。

4. 结论

在本文中,我们简要介绍了如何编写基本的 Javadoc 注释,并使用 Javadoc 命令行工具生成文档。

更简便的方式是使用 IDE 内置的生成功能,或将 Maven 插件集成到 pom.xml 文件中并运行相应命令。