java是跨平台的东西,但有的时候我们不需要它去跨平台,我们希望能想c++做的程序一样,编码和简单处理后能够在系统运行。
这次的项目是要放到classmate
pc
上,这款机器是为学生订做的,系统资源很有限,一个jre1.5就70多M,放在上面肯定是不行的。于是我找了一些相关的资料,提供链接如下:
如何制作最小的RCP程序压缩包(包含JRE)
java程序发布之jre篇
基本知道思路了,我把写的程序打包成jar,能双击运行了,然后拷贝一个jre到程序目录下,具体是这样的,目录叫dict,dict下面有dict.jar、jre(目录),然后写了一个cmd脚本:
@echo off
set path=%cd%\jre\bin
java -jar -verbose:class
dict.jar
>>class.txt
pause
这样程序使用的就是当前目录下的jre,程序运行后,最好把所有的功能使用一遍,这样输出了一个文件class.txt,里面有所有需要的class,其格式如下:
[Opened D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Object
from D:\data\dict\jre\lib\rt.jar]
[Loaded java.io.Serializable from
D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Comparable from
D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from
D:\data\dict\jre\lib\rt.jar]
[Loaded
org.apache.lucene.index.CompoundFileReader$FileEntry from
file:/D:/data/dict/dict.jar]
我们依照这个文件来裁剪rt.jar:
首先在utralEdit中进行一些处理,去掉所有不是rt.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式:
java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String
然后写一个脚本或者程序处理,将rt中需要的的class拷贝到另一个对应的文件夹rt1,我用java写了一个,没有时间仔细改,但能完任务了。代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//我裁剪出来的rt大小为500多k。然后将rt1里面的目录和文件打包成rt.zip,改名为rt.jar,然后替换原来的rt.jar。具体的步骤可以参考上面提到的那两篇文章。
public class ReduceRt {
// 文件拷贝
public static boolean copy(String file1, String file2,String file3) {
try // must try and catch,otherwide will compile error
{
// instance the File as file_in and file_out
java.io.File file_in = new java.io.File(file1);
java.io.File file_out = new java.io.File(file2);
if(!file_out.exists()){
file_out.mkdirs();
}
FileInputStream in1 = new FileInputStream(file_in);
FileOutputStream out1 = new FileOutputStream(file3);
byte[] bytes = new byte[1024];
int c;
while ((c = in1.read(bytes)) != -1)
out1.write(bytes, 0, c);
in1.close();
out1.close();
return (true); // if success then return true
}
catch (Exception e) {
System.out.println("Error!");
return (false); // if fail then return false
}
}
// 读取路径,copy
public static int dealClass(String needfile) throws IOException {
int sn = 0; // 成功个数
String Loaded = "Loaded";
File usedclass = new File(needfile);
if (usedclass.canRead()) {
String line = null;
LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass), "GBK"));
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.lastIndexOf("rt.jar") != -1) {
int start = line.indexOf(Loaded);
if (start != -1) {
int end = line.lastIndexOf("from");
if(end != -1){
String str = line.substring(start+Loaded.length()+1, end-1);
Pattern p = Pattern.compile("\\.");
Matcher m = p.matcher(str);
String after = m.replaceAll("/");
String file1 = after+".class";
int hg = file1.lastIndexOf("/");
if(hg != -1){
String file2 = "rt1/"+file1.substring(0, hg);
copy("rt/"+file1,file2,"rt1/"+file1);
}
}
}
}
}
}
return sn;
}
public static void main(String[] args) {
String needfile = "class.txt";
try {
int sn = dealClass(needfile);
System.out.print(sn);
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
分享到:
相关推荐
笔者精简了jre,并给出一个可用实例,笔者有一个java项目,已经对jre进行精简,制作了可执行包,从140M减到了20M,在精简jre的过程中,笔者也写了一些脚本和代码,旨在过程化该解决方案, 但是由于使用了exe4j,而...
精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. ...
精简 jre 效果 程序
最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...
最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。
因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...
Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用
制作桌面软件exe执行文件和精简jre步骤
NULL 博文链接:https://jarg.iteye.com/blog/868287
适合需要通过java开发桌面程序的小朋友
精简JRE(windows32位和64位,linux 32位和64位)。 JRE 的精简主要是rt.jar的精简,会删除无用的class。
GreenJVMMake - CSDN下载 下载 这是一个配合GreenJVM使用的JRE精简工具,可以动态的获取应用程序中对于rt.jar的class依赖,并根据依赖关系自动构成精简后的rt.jar.
精简版jre
制作 docker 精简 jre8 基础镜像,基础镜像为bitnami/minideb,jdk8u321版本,已解决httpclient中文乱码和webservice-client缺包问题。
最新精简jre,支持swing组件,很好用的jre,只有十几兆
精简的JRE,以及用于Jar文件转exe文件的工具Jsmooth
超级精简版的jre,超级精简版的jre,超级精简版的jre,超级精简版的jre
NULL 博文链接:https://geek41.iteye.com/blog/1183836
自己动手精简我们jre,再打包成exe这样java程序就可以在windows下很好的运行了,而且jre体积也很小不影响下载!感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面...
最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre