设置 Eclipse 项目以使用修补的运行时库
Setting an Eclipse project to use a patched runtime library
我正在尝试创建一个 运行 是 rt.jar
的本地补丁版本的 Eclipse 项目。本地是指 Eclipse 项目的本地。 Eclipse 项目包含一个名为 runtimes
的文件夹,其中包含默认 运行time jar 的副本。我已将项目的 class 路径设置为使用这些库 jar 而不是系统 jar(使用 IJavaProject.setRawClasspath)。
Eclipse项目单机测试class。
import java.io.File;
public class POC {
public static void main(String[] args) {
System.out.println("File Resource:");
ClassLoader loader = POC.class.getClassLoader();
System.out.println(loader.getResource("java/io/File.class"));
System.out.println("\nLibrary Path:");
String librarypath = System.getProperty("java.library.path");
String[] librarypathEntries = librarypath.split(File.pathSeparator);
for(String lp : librarypathEntries){
System.out.println(lp);
}
System.out.println("\nClasspath:");
String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
for(String cp : classpathEntries){
System.out.println(cp);
}
}
}
目前它打印出一些效果...
File Resource:
jar:file:/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/rt.jar!/java/io/File.class
Library Path:
/Users/ben/Library/Java/Extensions
/Library/Java/Extensions
/Network/Library/Java/Extensions
/System/Library/Java/Extensions
/usr/lib/java
.
Classpath:
/Users/ben/.../workspace/Test/runtimes/resources.jar
/Users/ben/.../workspace/Test/runtimes/rt.jar
/Users/ben/.../workspace/Test/runtimes/jsse.jar
/Users/ben/.../workspace/Test/runtimes/jce.jar
/Users/ben/.../workspace/Test/runtimes/charsets.jar
/Users/ben/.../workspace/Test/runtimes/jfr.jar
/Users/ben/.../workspace/Test/runtimes/JObjC.jar
/Users/ben/.../workspace/Test/runtimes/dnsns.jar
/Users/ben/.../workspace/Test/runtimes/localedata.jar
/Users/ben/.../workspace/Test/runtimes/sunec.jar
/Users/ben/.../workspace/Test/runtimes/sunjce_provider.jar
/Users/ben/.../workspace/Test/runtimes/sunpkcs11.jar
/Users/ben/.../workspace/Test/runtimes/zipfs.jar
/Users/ben/.../workspace/Test/runtimes/MRJToolkit.jar
/Users/ben/.../workspace/Test/bin
显然设置 class 路径还不够,我尝试编辑 Run Configurations
并为 -Xbootclasspath as suggested by this article.
设置一些 VM 参数变体
示例:-Xbootclasspath/p:/Users/.../workspace/Test/runtimes/rt.jar;
这似乎对文件资源输出没有影响(它总是加载文件的原始实现)。
我也试过 -Djava.library.path=/Users/ben/.../Test/runtimes/
,但也没有改变文件资源。
我想知道它是否与 this question 有关。
P.S。我知道覆盖 rt.jar 文件中的 class 的应用程序违反了 Java SE 运行-time 环境二进制代码许可证。这不是用于生产,我只是想看看它的工作。
好的,事实证明 -Xbootclasspath
是我所需要的。我的运行时 jar 修改导致无效的 rt.jar
文件,这是我感到沮丧的根本原因。
回答我自己的问题以防其他人发现它有用。
我正在尝试创建一个 运行 是 rt.jar
的本地补丁版本的 Eclipse 项目。本地是指 Eclipse 项目的本地。 Eclipse 项目包含一个名为 runtimes
的文件夹,其中包含默认 运行time jar 的副本。我已将项目的 class 路径设置为使用这些库 jar 而不是系统 jar(使用 IJavaProject.setRawClasspath)。
Eclipse项目单机测试class。
import java.io.File;
public class POC {
public static void main(String[] args) {
System.out.println("File Resource:");
ClassLoader loader = POC.class.getClassLoader();
System.out.println(loader.getResource("java/io/File.class"));
System.out.println("\nLibrary Path:");
String librarypath = System.getProperty("java.library.path");
String[] librarypathEntries = librarypath.split(File.pathSeparator);
for(String lp : librarypathEntries){
System.out.println(lp);
}
System.out.println("\nClasspath:");
String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
for(String cp : classpathEntries){
System.out.println(cp);
}
}
}
目前它打印出一些效果...
File Resource:
jar:file:/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/rt.jar!/java/io/File.class
Library Path:
/Users/ben/Library/Java/Extensions
/Library/Java/Extensions
/Network/Library/Java/Extensions
/System/Library/Java/Extensions
/usr/lib/java
.
Classpath:
/Users/ben/.../workspace/Test/runtimes/resources.jar
/Users/ben/.../workspace/Test/runtimes/rt.jar
/Users/ben/.../workspace/Test/runtimes/jsse.jar
/Users/ben/.../workspace/Test/runtimes/jce.jar
/Users/ben/.../workspace/Test/runtimes/charsets.jar
/Users/ben/.../workspace/Test/runtimes/jfr.jar
/Users/ben/.../workspace/Test/runtimes/JObjC.jar
/Users/ben/.../workspace/Test/runtimes/dnsns.jar
/Users/ben/.../workspace/Test/runtimes/localedata.jar
/Users/ben/.../workspace/Test/runtimes/sunec.jar
/Users/ben/.../workspace/Test/runtimes/sunjce_provider.jar
/Users/ben/.../workspace/Test/runtimes/sunpkcs11.jar
/Users/ben/.../workspace/Test/runtimes/zipfs.jar
/Users/ben/.../workspace/Test/runtimes/MRJToolkit.jar
/Users/ben/.../workspace/Test/bin
显然设置 class 路径还不够,我尝试编辑 Run Configurations
并为 -Xbootclasspath as suggested by this article.
示例:-Xbootclasspath/p:/Users/.../workspace/Test/runtimes/rt.jar;
这似乎对文件资源输出没有影响(它总是加载文件的原始实现)。
我也试过 -Djava.library.path=/Users/ben/.../Test/runtimes/
,但也没有改变文件资源。
我想知道它是否与 this question 有关。
P.S。我知道覆盖 rt.jar 文件中的 class 的应用程序违反了 Java SE 运行-time 环境二进制代码许可证。这不是用于生产,我只是想看看它的工作。
好的,事实证明 -Xbootclasspath
是我所需要的。我的运行时 jar 修改导致无效的 rt.jar
文件,这是我感到沮丧的根本原因。
回答我自己的问题以防其他人发现它有用。