maven-javadoc-plugin 错误 javadoc: 错误 - 无法读取输入长度 = 1,目录名称中包含非 ASCII 字符
maven-javadoc-plugin error javadoc: error - cannot read Input length = 1 with non-ASCII characters in directory name
我在 Windows10 上使用 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.bat
、options
和packages
。 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 插件有问题吗?任何人都知道这是从哪里来的?我应该在哪里提交故障单?还是我做错了什么?
正如您所说,这看起来像是用于将文件写入 target/apidocs
的编码。
查看 maven-javadoc-plugin 的源代码,它只是在编写这些文件时使用平台编码 - 例如this line.
在调用 Maven 时直接设置编码为我修复了上面的示例:
mvn clean package -Dfile.encoding=UTF-8
尽管这感觉更像是一种解决方法,而不是一个很好的解决方案 - 它需要假设没有其他依赖于 Maven 构建中的平台编码。
我认为原因是主要 JDK 在 8 和 9 之间发生了变化。解析参数文件(例如 javadoc 命令中的 @options
的代码位(实际上在 javac 下) line) has switched from using the platform encoding here to calling Files.newBufferedReader()
here. Files.newBufferedReader(Path) 表示如果未指定编码,它会使用 UTF-8。这意味着 javac 和 javadoc 中的参数文件现在必须以 UTF-8 编码。
此maven 构建错误是由于在插件定义中添加了一些非法参数引起的。例如,我使用了一个“过滤器”元素,结果发现我使用的 Spring 引导版本无法识别此参数,导致您在标题中发布了一个模糊的“Length=1”错误。通过删除非法参数,问题得到解决。
我在 Windows10 上使用 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.bat
、options
和packages
。 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 插件有问题吗?任何人都知道这是从哪里来的?我应该在哪里提交故障单?还是我做错了什么?
正如您所说,这看起来像是用于将文件写入 target/apidocs
的编码。
查看 maven-javadoc-plugin 的源代码,它只是在编写这些文件时使用平台编码 - 例如this line.
在调用 Maven 时直接设置编码为我修复了上面的示例:
mvn clean package -Dfile.encoding=UTF-8
尽管这感觉更像是一种解决方法,而不是一个很好的解决方案 - 它需要假设没有其他依赖于 Maven 构建中的平台编码。
我认为原因是主要 JDK 在 8 和 9 之间发生了变化。解析参数文件(例如 javadoc 命令中的 @options
的代码位(实际上在 javac 下) line) has switched from using the platform encoding here to calling Files.newBufferedReader()
here. Files.newBufferedReader(Path) 表示如果未指定编码,它会使用 UTF-8。这意味着 javac 和 javadoc 中的参数文件现在必须以 UTF-8 编码。
此maven 构建错误是由于在插件定义中添加了一些非法参数引起的。例如,我使用了一个“过滤器”元素,结果发现我使用的 Spring 引导版本无法识别此参数,导致您在标题中发布了一个模糊的“Length=1”错误。通过删除非法参数,问题得到解决。