Java8JDK源代码用javac命令行编译器编译

Compilation of the Java 8 JDK source code with javac command line compiler

请问如何使用 Javac 编译带有调试信息的 JDK 源文件。

我正在使用以下命令:

javac -J-Xms16m -J-Xmx1024m -source 8 -target 8 -sourcepath d:\jdk_src -classpath ".:rt.jar:javax-crypto.jar:ui.jar" -bootclasspath ".:rt.jar:javax-crypto.jar:ui.jar" -d "jdk_debug" -g @filelist.txt >> log.txt 2>&1

重现步骤:

没有成功编译 类,而是出现了如下错误:

 \jdk\jdk_src\java\lang\reflect\AccessibleObject.java:29: error: package sun.reflect does not exist import sun.reflect.Reflection;
 \jdk\jdk_src\java\lang\reflect\AccessibleObject.java:30: error: package sun.reflect does not exist import sun.reflect.ReflectionFactory;
 \jdk\jdk_src\java\util\jar\Attributes.java:37: error: package >sun.util.logging does not exist

这些包存在于提供的 jar 中(rt.jar、ui.jar 和 javax-crypto.jar)。您能解释一下为什么源代码没有被编译,因为类路径文件已提供给编译器吗?

如有任何反馈,我们将不胜感激。

谢谢。

Java 源代码并非设计为以这种方式构建。应该做的是检查 OpenJDK 源代码树并按照源代码树中的构建说明进行操作。您应该能够调整构建脚本以使用调试信息进行编译...并直接使用构建的“rt.jar”或从构建工件中提取您需要的类。

您可以从 Github 获得 Java 8 源代码:https://github.com/openjdk/jdk8u。 (附近有其他版本...) Select git 标签对应于您要构建的 Java 版本。构建说明的链接在 README.md 文件中。

当您按照您的方式进行编译时,编译失败的原因并不完全清楚。但是,javac 编译器实施了一些限制,旨在阻止您针对“rt.jar”中的内部 API 编译普通应用程序代码。您正在编译的某些“src.zip”代码(legitimately)取决于内部 API。