如何重新编译Java运行环境(JRE)?

3
我以为这很容易。我下载了JDK,解压了src.zip,修改了JDK以适应我的需求并保存了文件。
现在,我唯一需要做的就是重新编译提取和更新的src文件夹到一个“JRE”中。我尝试使用javac,但没有任何进展。例如,我得到了错误,说没有给出源文件。显然,我没有使用正确的语法来编译JRE。
那么,有人能告诉我,如何获得一个包含基于从JDK提取的新源文件的修改后的Java运行时环境的工作“JRE”文件夹吗?
注意:我不会重新分发编译。它只供个人自用。
更新:感谢回答和http://www.javalobby.org/java/forums/t103334.html,我得到了以下命令:"c:\tmp\jdk1.6.0_17\bin\javac" -classpath "c:\tmp\out" -verbose -g -d "c:\tmp\out" -J-Xmx512m -cp "c:\jdk1.6.0_17\jre\lib\rt.jar";"c:\jdk1.6.0_17\lib\tools.jar" @files.txt - 不幸的是,虽然它似乎在处理东西,但处理完后输出文件夹/out为空。我的命令有问题吗?
提前致谢。
6个回答

2

将classpath设置为提取源目录的顶部。编译文件,然后将它们的.class文件放回rt.jar中。


根据您的建议和http://www.javalobby.org/java/forums/t103334.html,我得到了以下命令:"c:\tmp\jdk1.6.0_17\bin\javac" -classpath "c:\tmp\out" -verbose -g -d "c:\tmp\out" -J-Xmx512m -cp "c:\jdk1.6.0_17\jre\lib\rt.jar";"c:\jdk1.6.0_17\lib\tools.jar" @files.txt。不幸的是,虽然它似乎在处理东西,但完成后输出文件夹/out为空。我的命令有问题吗? - Tom

2
您将无法仅凭提供的源代码编译整个Sun/Oracle JDK,因为其中许多类在内部使用专有包(例如com.sun.*)中的专有类和本地方法,当然这些的源代码未包含在JDK中。您必须通过特殊的源代码发布获取它们或使用OpenJDK(我不知道使本地内容工作是简单还是困难)。或者,可能可以选择性地重新编译只有特定的类 - 但当然,只有在您不以使它们与JDK中现有用法不兼容的方式更改它们时才能这样做。

1
例如,我遇到了“未提供源文件”的错误。
你必须告诉javac要编译哪个.java文件。javac告诉你它没有提供任何文件来进行编译。

1
有趣。然而,我不知道如何最终获得一个可工作的JRE。例如,如果我修改了String.java文件,我该如何获得一个反映这个变化的可工作的JRE文件夹呢? - Tom

1

以防万一,您可以按照说明编译OpenJDK,或者使用IcedTea(他们还提供了不使用IcedTea工具链构建OpenJDK的指导)。


0

不要使用

"c:\tmp\jdk1.6.0_17\bin\javac" -classpath "c:\tmp\out" -verbose -g -d "c:\tmp\out" -J-Xmx512m -cp 

请尝试以下内容:

set path=C:\tmp\jdk1.6.0_17\bin

在您的计算机上按下回车键,然后输入以下内容以创建类。
C:\tmp>set classpath=.

再次在您的计算机键盘上按下回车键,然后进行编译

C:\tmp>javac YourProgramName.java

运行您的程序

C:\tmp>java YourProgramName

0
根据Sun的许可证

Java技术限制。您不得创建、修改或更改“java”、“javax”、“sun”或Sun在任何命名约定指定的类、接口或子包的行为,也不得授权您的许可证持有者创建、修改或更改这些内容。

换句话说,您不能以任何形式重新分发修改后的JVM。如果要这样做,需要与Sun联系获取许可证。 编辑:@Tom Hawtin是正确的;这仅适用于Sun官方的“纯净”JRE,即最终用户安装在计算机上的那个JRE。

除非是OpenJDK,否则还有JRL和JIUL许可证。 - Tom Hawtin - tackline
1
这不会成为问题,因为我不会重新分发编译。我更新了我的问题以反映这一点。 - Tom

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