我在Windows 10上使用OpenJDK11。我有一个非常简单的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>
奇怪的是,仅运行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插件有问题吗?任何人都知道这起源于何处?我应该在哪里提交故障单?还是我做错了什么?
答案 0 :(得分:2)
正如您所说,这看起来像用于将文件写入target/apidocs
的编码。
仔细查看maven-javadoc-plugin的源代码,它只是在编写这些文件时使用平台编码-例如this line。
在调用Maven时直接设置编码对我来说修复了上面的示例:
mvn clean package -Dfile.encoding=UTF-8
这虽然感觉更像是一种解决方法,而不是一个好的解决方法-它需要假设没有其他依赖于Maven构建中的平台编码。
我认为原因是主JDK在8到9之间发生了变化。解析参数文件(例如javadoc命令行中的@options
)的代码段(实际上在javac下)已从使用切换为平台编码here来调用Files.newBufferedReader()
here。 Files.newBufferedReader(Path)指出,如果未指定编码,它将使用UTF-8。这意味着在javac和javadoc中的参数文件现在都必须以UTF-8编码。