JAVA打包称JAR怎么带上JRE

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

让java程序带上精简的jre(附工具)

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 ng.Object from D:\data\dict\jre\lib\rt.jar]

[Loaded java.io.Serializable from D:\data\dict\jre\lib\rt.jar]

[Loaded parable from D:\data\dict\jre\lib\rt.jar]

[Loaded ng.CharSequence from D:\data\dict\jre\lib\rt.jar]

[Loaded poundFileReader$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;

public class ReduceRt {

//文件拷贝

public static boolean copy(String file1,String file2)

{

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);

FileInputStream in1=new FileInputStream(file_in);

FileOutputStream out1=new FileOutputStream(file_out);

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 ,String sdir,String odir) throws IOException {

int sn = 0; //成功个数

File usedclass = new File(needfile);

if(usedclass.canRead())

{

String line = null;

LineNumberReader reader = new LineNumberReader(new InputStreamReader(new

FileInputStream(usedclass),"UTF-8"));

while((line = reader.readLine())!=null)

{

line = line.trim();

int dirpos =stIndexOf("/");

if(dirpos>0)

{

String dir = odir+ line.substring(0,dirpos);

File fdir = new File(dir);

if(!fdir.exists())

fdir.mkdirs();

String sf = sdir + line + ".class";

String of = odir + line + ".class";

boolean copy_ok=copy(sf.trim(),of.trim());

if(copy_ok)

相关文档
最新文档