maven-javadoc-plugin错误javadoc:错误 - 无法读取输入长度= 1,目录名称中包含非ASCII字符

Gar*_*son 6 java maven maven-javadoc-plugin

我在Windows 10上使用OpenJDK 11.我有一个非常简单的POM,用于生成Javadocs的单个Java文件.这是一个摘录:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.target>11</maven.compiler.target>
</properties>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>3.0.1</version>
      <executions>
        <execution>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

奇怪的是刚刚运行mvn clean package会导致错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:3.0.1:jar (default) on project foobar: MavenReportException: Error while generating Javadoc:
[ERROR] Exit code: 1 - javadoc: error - cannot read Input length = 1
[ERROR]
[ERROR] Command line was: C:\bin\jdk-11\bin\javadoc.exe @options @packages
Run Code Online (Sandbox Code Playgroud)

target/apidocs只有三个文件:javadoc.bat,options,和packages.该options文件是最有趣的.它明确地说UTF-8到处都是,应该如此.但看看这些线:

-sourcepath
C:/projects/li??o 1/src/main/java
Run Code Online (Sandbox Code Playgroud)

这个项目是在C:\projects\lição 1.似乎链Java或Maven或Javadoc插件的某个地方没有正确地将目录名转换为UTF-8.

果然; 当我在Windows中重命名目录以删除非ASCII字符时,mvn clean package工作得很好.

这似乎是一个明显的错误; 一旦Maven开始,一切都应该是UTF-8.这是Javadoc插件的问题吗?任何人都知道这起源于何处?我应该在哪里提交错误机票?或者我做错了什么?

df7*_*899 4

正如您所说,这看起来像是用于将文件写入target/apidocs.

查看 maven-javadoc-plugin 的源代码,它只是在编写这些文件时使用平台编码 - 例如这一行

调用 Maven 时直接设置编码为我修复了上面的示例:

mvn clean package -Dfile.encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

不过,这感觉更像是一种解决方法,而不是一个好的修复方案 - 它需要假设没有任何其他内容取决于 Maven 构建中的平台编码。

我认为原因是主JDK在8和9之间发生了变化。解析参数文件(例如@options在javadoc命令行中)的代码位(实际上在javac下)已从使用平台编码here切换为调用Files.newBufferedReader() hereFiles.newBufferedReader(Path)声明如果未指定编码,则使用 UTF-8。这意味着 javac 和 javadoc 中的参数文件现在必须以 UTF-8 进行编码。