Maven Javadoc插件错误:javadoc:错误 - 无法读取包含非ASCII字符的目录名称中的输入长度= 1。

6

我正在Windows 10上使用OpenJDK 11。我有一个非常简单的POM文件,用于生成Java文档,只包含一个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>

奇怪的是,仅运行 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

target/apidocs 文件夹中只有三个文件:javadoc.batoptionspackages。其中,options 文件最有意思。它明确地在每个地方都使用了 UTF-8,这是应该的。但请看以下几行:
-sourcepath
C:/projects/li��o 1/src/main/java

此项目位于 C:\projects\lição 1。似乎在Java、Maven或Javadoc插件的链式过程中,某个地方未正确将目录名称转换为UTF-8。
确实如此;当我在Windows中重命名目录以删除非ASCII字符时,mvn clean package 就可以正常工作了。
这似乎是一个明显的错误;一旦Maven启动,整个过程都应该使用UTF-8。这是Javadoc插件的问题吗?有谁知道这是从哪里开始的?我应该在哪里提交错误报告?或者是我的操作有误?

首先,您已经定义了源编码...问题是Maven使用的JVM分配了哪种编码?https://issues.apache.org/jira/projects/MJAVADOC/? - khmarbaise
你尝试过在 <properties> 块中添加 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 吗? - Mikhail Kholodkov
你能给我一些参考,说明这个程序应该做什么,还是说这只是你猜测的,没有尝试过? - Garret Wilson
请注意,https://maven.apache.org/plugins/maven-javadoc-plugin/jar-mojo.html 明确指出 encoding 默认为 project.build.sourceEncoding。但我们正在讨论目录名称的解释。我认为这是一个错误。 - Garret Wilson
Mikhail,“docencoding”(这是使用您提到的“project.reporting.outputEncoding”的配置)指定了输出编码。这与插件放置在“options”文件中的目录名称的编码有什么关系?您是否在自己的计算机上重现了此问题?您是否看到我所说的这个“options”文件?您理解这个问题吗? - Garret Wilson
2个回答

4
正如你所说,这看起来就像是编码方式用于写入文件到target/apidocs
查看maven-javadoc-plugin的源代码,它只是在写这些文件时使用平台编码方式 - 例如this line
在调用Maven时直接设置编码方式,可以为我修复上面的示例。
mvn clean package -Dfile.encoding=UTF-8

这种方法感觉更像是一种权宜之计,而不是一个好的解决方案——需要假设在Maven构建中没有其他依赖于平台编码。
我认为问题的原因是JDK 8和9之间主要JDK发生了变化。代码部分(实际上在javac下)解析参数文件(例如javadoc命令行中的@options)已从使用平台编码here 切换到调用Files.newBufferedReader()hereFiles.newBufferedReader(Path)说明如果未指定编码,则使用UTF-8。这意味着无论是javac还是javadoc中的参数文件现在都必须使用UTF-8进行编码。

在我看来,这确实是一个 bug。你有任何想法在哪里提交 Maven Javadoc 插件的 bug? - Garret Wilson
这里有关于Jira问题跟踪器的详细信息链接。目前无法发现任何明显的异常。 - df778899
好的,我已经提交了MJAVADOC-581 - Garret Wilson

0

这个Maven构建错误是由于在插件定义中添加了一些非法参数导致的。例如,我使用了一个“filter”元素,结果发现我使用的Spring Boot版本不认识这个参数,导致出现了一个模糊的“Length=1”错误,就像你在标题中发布的那样。通过删除非法参数,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接