1139365029
本帖最后由 1139365029 于 2023-12-19 00:42 编辑










之前有段时间一直在想,如果java的体积很小的话,会不会更方便一点,
虽然不确定跟整合包一起分享会不会方便刚入坑的萌新,但至少会节约很多下载时间。
======精简过程======
首先找到java.exe所在的bin目录,删掉除了bin和lib之外的其它文件和目录









打开HMCL启动器或其它拥有导出启动脚本功能的启动器,导出启动脚本,添加参数 -verbose:class









在最末尾打个空格,后面写上 >>classList.txt









然后启动游戏,进入存档,将整合包的大部分功能都随便点一下,
不要退出游戏,打开java的bin目录,全选-删除,此时会提示文件已打开,点跳过









此时bin目录已完成精简,接下来是lib目录,其实这个目录里面需要精简的只有一个rt.jar文件,
剩下的文件很多都可以删除,不过每次删除后建议启动一下游戏看看能不能进存档,
将rt.jar用压缩软件打开,全部解压到一个目录里面,
退出游戏,在游戏目录下找到classList.txt文件,打开它,这里只看以“Loaded”开头,“rt.jar”结尾的行,中间就是用到的文件,









例如第一行“java.lang.Object”,指的就是java\lang\Object.class文件,
找到之前解压的rt.jar目录,将用到的都保留,没用到的全删掉(META-INF目录除外),什么?你打算一个一个找?你写个脚本啊package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class test {
        
        private static String file="E:\\game\\我的世界1.12.2 - 客户端\\.minecraft\\classList.txt";//classList文件目录
        private static String jar="C:\\Program Files\\Java\\jdk1.8.0_391\\jre\\lib\\rt.jar";//原rt.jar所在位置
        private static String resPath="E:\\mc\\temp\\res\";//解压后的目录
        private static String outPath="E:\\mc\\temp\\out\";//处理后的目录
        
        public static void main(String[] args) throws Exception {
                List list=read(new File(file));
                for(String s:list) {
                        copy(s);
                }
        }
        
        private static List read(File f) {
                List re=new ArrayList();
                if(!f.exists()) {
                        return null;
                }
                BufferedReader br=null;
                try {
                        br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8"));
                        String s=null;
                        String tmp=" from "+jar+"]";
                        while((s=br.readLine())!=null){
                                if(s.startsWith("[Loaded ") && s.endsWith(tmp)) {
                                        re.add(resPath+s.substring(8, s.length()-tmp.length()).replaceAll("\\.", "/")+".class");
                                }
                        }
                } catch (Exception ex) {
                ex.printStackTrace();
                        return null;
                } finally{
                        try {
                                br.close();
                        } catch (Exception e) {}
                }
                return re;
        }
        
        private static void copy(String res) {
                File out=new File(outPath+res.substring(resPath.length()));
                File path=out.getParentFile();
                if(!path.exists()) {
                        path.mkdirs();
                }
                OutputStream ou=null;
                InputStream in=null;
                try {
                        in=new FileInputStream(new File(res));
                        ou=new FileOutputStream(out);
                byte[] buf = new byte[8192];
                int n;
                while ((n = in.read(buf)) > 0) {
                    ou.write(buf, 0, n);
                }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally{
                        try {
                                ou.close();
                                in.close();
                        } catch (Exception e2) {}
                }
               
        }
}复制代码将处理后的目录重新压缩成zip文件,重命名为rt.jar,这时,一个仅6MB的文件就诞生了,替换掉原来的文件,









至此,java的精简就已经完成了,测试一下如果能进游戏的话就没有问题了









======精简结果======



第一页 上一页 下一页 最后一页