文章目录 一、裁剪 lib 目录下的 jar 文件 二、压缩 rt.jar 文件 参考博客 : 精简jre1.8 精简jre步骤 裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 ( 本篇博客的资源快照 /han1202012/87389091 JRE 裁剪分为三步 : 第一步 : 裁剪 bin 目录下的 dll 动态库文件 ; 第二步 : 裁剪 lib 目录下的 jar 文件 ; 第三步 : 裁剪 rt.jar jar 文件后 , 程序仍然正常执行 ; 此时 jre 还剩下 76MB ; 二、压缩 rt.jar 文件 ---- 将 rt.jar 拷贝出来 , 进行解压 ; 解压后 , 得到这些目录文件 ; 在上述解压 rt.jar 的目录下 , 执行如下命令 , 重新打包 rt.jar ; jar cvf rt.jar com java javax org sun jdk 压缩完毕后 , rt.jar 只有 30MB 左右 ; 将压缩后的 rt.jar 拷贝到 jre 的 lib 目录下 ; 此时程序依然可以执行 ; jre 裁剪后 30MB ;
Contents/Home/jre/lib/resources.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_40/Contents/Home/jre/lib/rt.jar ] [Loaded java.util.Map from /Library/Java/JavaVirtualMachines/jdk1.8.0_40/Contents/Home/jre/lib/rt.jar ] [Loaded java.io.File from /Library/Java/JavaVirtualMachines/jdk1.8.0_40/Contents/Home/jre/lib/rt.jar ] [Loaded java.net.URL from /Library/Java/JavaVirtualMachines/jdk1.8.0_40/Contents/Home/jre/lib/rt.jar ] [Loaded sun.misc.VM from /Library/Java/JavaVirtualMachines/jdk1.8.0_40/Contents/Home/jre/lib/rt.jar
] [Loaded sun.nio.cs.StreamDecoder from C:\Program Files\Java\jdk1.6.0_22\jre\lib\rt.jar] [Loaded \Java\jdk1.6.0_22\jre\lib\rt.jar] [Loaded java.util.concurrent.ConcurrentMap from C:\Program Files\ \jdk1.6.0_22\jre\lib\rt.jar] [Loaded java.util.concurrent.locks.ReentrantLock from C:\Program Files _22\jre\lib\rt.jar] [Loaded java.util.BitSet from C:\Program Files\Java\jdk1.6.0_22\jre\lib\rt.jar] C:\Program Files\Java\jdk1.6.0_22\jre\lib\rt.jar] [Loaded java.util.HashSet from C:\Program Files\
对于程序员而言,阅读源码是一个非常重要的能力,相信Java程序员最常看的就是JDK的源码了,但有时候我们想具体看看源码在运行时某个变量的值,就会发现Debug时看不到变量的值,这是因为官方在编译 rt.jar 具体步骤: 1.制作可调试的 rt.jar 包 1.1 .在D盘新建jdk7_src及jdk7_rt-debug两个文件夹 ? 1.5.复制jre/lib/rt.jar 把JDK安装目录(复制src.zip的那个目录)下jre/lib下的rt.jar复制到jdk7_src目录下 ? ? 2.使用可调试的 rt.jar 2.1.把rt_debug.jar放入JDK中 放入java_home/jre/lib/endorsed目录 ? 2.3.添加rt_debug.jar的源码包 注意:若原来的JRE目录下已经存在了rt.jar包,则要将新编译的rt_debug.jar的位置在原来的jar包之前,如下图所示。 ?
启动时一直报如下错误: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar :1.6.0_29] at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_29] at org.jboss.threads.JBossThread.run java.lang.NoClassDefFoundError: sun/rmi/server/MarshalOutputStream at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar :1.6.0_29] at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) [rt.jar:1.6.0_29] at java.lang.ClassLoader.defineClass(ClassLoader.java:615) [rt.jar:1.6.0_29] at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass
] [Loaded sun.reflect.DelegatingMethodAccessorImpl from D:\jdk8\jre\lib\rt.jar] Hello,0 Hello,1 Hello from D:\jdk8\jre\lib\rt.jar] [Loaded sun.reflect.ByteVectorFactory from D:\jdk8\jre\lib\rt.jar] [Loaded jre\lib\rt.jar] [Loaded sun.reflect.ClassFileAssembler from D:\jdk8\jre\lib\rt.jar] [Loaded sun.reflect.UTF8 from D:\jdk8\jre\lib\rt.jar] [Loaded sun.reflect.Label from D:\jdk8\jre\lib\rt.jar] [Loaded sun.reflect.Label $PatchInfo from D:\jdk8\jre\lib\rt.jar] [Loaded java.util.A
/jre/lib/charsets.jar/sun/awt jdk1.8.0_161/jre/lib/resources.jar/javax/swing jdk1.8.0_161/jre/lib/rt.jar /com/sun/awt jdk1.8.0_161/jre/lib/rt.jar/com/sun/java/swing jdk1.8.0_161/jre/lib/rt.jar/com/sun/swing jdk1.8.0_161/jre/lib/rt.jar/java/applet jdk1.8.0_161/jre/lib/rt.jar/java/awt jdk1.8.0_161/jre/lib /rt.jar/javax/swing jdk1.8.0_161/jre/lib/rt.jar/sun/applet jdk1.8.0_161/jre/lib/rt.jar/sun/awt jdk1.8.0 _161/jre/lib/rt.jar/sun/java2d jdk1.8.0_161/jre/lib/rt.jar/sun/swing 总结 这个JDK精简的实现并不涉及任何技术难点,也并非必要.在我自己的实际场景中是因为触及到需要大量拷贝
Files (x86)\Java\jdk1.8.0_181\jre\lib\rt.jar] [Loaded java.lang.CharSequence from C:\Program Files ( x86)\Java\jdk1.8.0_181\jre\lib\rt.jar] [Loaded java.lang.String from C:\Program Files (x86)\Java\jdk1.8.0 _181\jre\lib\rt.jar] [Loaded java.lang.reflect.AnnotatedElement from C:\Program Files (x86)\Java\jdk1.8.0 _181\jre\lib\rt.jar] [Loaded java.lang.reflect.Type from C:\Program Files (x86)\Java\jdk1.8.0_181\jre \lib\rt.jar] [Loaded java.lang.Class from C:\Program Files (x86)\Java\jdk1.8.0_181\jre\lib\rt.jar] 。。
/Java/JavaVirtualMachines/1.6.0_38-b04-436.jdk/Contents/Home 注:1.6.0_38-b04-436.jdk目录名字与安装的jdk版本有关 rt.jar rt.jar已经集成到/Library/Java/JavaVirtualMachines/1.6.0_38-b04-436.jdk/Contents/Classes/classes.jar,jsse.jar 建立软连接到/Library/Java/JavaVirtualMachines/1.6.0_38-b04-436.jdk/Contents/Home/lib/下,并且classes.jar的软连接命名为rt.jar 这样就可以避免一些时候会发生找不到rt.jar的问题了,例如在使用混淆码的时候。
] [Loaded jdk.internal.org.objectweb.asm.ClassWriter from F:\Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded from F:\Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.MethodVisitor from F: \Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.MethodWriter from F:\Java_JDK \JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.Type from F:\Java_JDK\JDK1.8\jre\lib\rt.jar from F:\Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.AnnotationVisitor from
] [Loaded java.lang.Shutdown$Lock from D:\JDK\jre1.8\lib\rt.jar] 我们可以结合JIT编译时间,结合JVM载入类的日志发现两个结论: 凡是使用了 ] [Loaded jdk.internal.org.objectweb.asm.ClassWriter from F:\Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded from F:\Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.MethodVisitor from F: \Java_JDK\JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.MethodWriter from F:\Java_JDK \JDK1.8\jre\lib\rt.jar] [Loaded jdk.internal.org.objectweb.asm.Type from F:\Java_JDK\JDK1.8\jre\lib\rt.jar
java.lang.Class$MethodArray from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Void from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar java.lang.Class$MethodArray from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Void from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Void from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar
1、首先依次点击windows->preference->java->install JARs->选中你的jre->点击Duplicate 2、找到 rt.jar并展开,这时会看到Soruce attachement 在弹出的新窗口中,选择External Location,再点击External File..找到你的jdk安装目录中的src.zip,将它添加进去,然后一路确认就可以了 dt.jar是关于运行环境的类库, rt.jar 有时候会出现不成功的现象,因为有可能是src.zip没有添加进去,再次执行步骤2时,找到rt.jar并展开,这时会看到Soruce attachement:(none)括号中仍是none。
java.lang.reflect.Type from /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Class from /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar java.lang.ClassLoader from /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.System from /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Error from /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/jre/lib/rt.jar
Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.io.Serializable from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.lang.Comparable from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.lang.CharSequence from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Void from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar
从rt.jar中提取对应的所须要的class 4.4. 将rt.jar中提取的class进行打包,就可以得到所需的jre核心jar包。 代码假定的前提: 1. Jre所在的路径 2. 将jre中的rt.jar打包在当前路径。 System.out.println("classes to be packed in size:" + classes.size()); classes.add(0, "/opt/jdk7/jre/lib/rt.jar () + " classes have been extracted successfully"); String[] cmdJarPackage = { "jar", "cvf", "rt.jar jarProcess = runtime.exec(cmdJarPackage); System.out .println("Jar the classes into a package rt.jar
Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.io.Serializable from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.lang.Comparable from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar java.lang.CharSequence from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar Loaded java.lang.Void from /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar
正确配置如下:Windows(分隔符英文分号):XML/HTML code bootclasspath ${java.home}/lib/rt.jar;${java.home}/lib/jce.jar </ bootclasspath linux(分隔符英文冒号):XML/HTML code bootclasspath ${java.home}/lib/rt.jar:${java.home}/
在类路径或引导类路径中找不到程序包 java.lang 解决方法:找到compilerArguments标签 Windows分隔符英文分号; <bootclasspath>${java.home}/lib/rt.jar ;${java.home}/lib/jce.jar</bootclasspath> linux分隔符英文冒号: <bootclasspath>${java.home}/lib/rt.jar:${java.home
ClassLoader):前面已经大致介绍过了,这个类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar 例如 java.lang.Object 存放在 rt.jar 中,如果编写另外一个 java.lang.Object 并放到 ClassPath 中,程序可以编译通过。 由于双亲委派模型的存在,所以在 rt.jar 中的 Object 比在 ClassPath 中的 Object 优先级更高,这是因为 rt.jar 中的 Object 使用的是启动类加载器,而 ClassPath rt.jar 中的 Object 优先级更高,那么程序中所有的 Object 都是这个 Object。