本帖最后由 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的精简就已经完成了,测试一下如果能进游戏的话就没有问题了

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


之前有段时间一直在想,如果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的精简就已经完成了,测试一下如果能进游戏的话就没有问题了

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