java封装exe精简jre

前文

最近写了一个基于登录cookie通过关键字获取微博内容并自动导出excel的exe小工具,刚开始我是准备直接在我之前的小工具批量下载百度图片的jre拿过来直接用(27M),但是不行,缺东西,后面就到百度找其他精简jre的方法,
然后搜到了一个方法:
1.把你应用程序.jar的依赖类输出出来

java -jar -verbose:class getweiboinfo.jar >> class.txt

得到一堆内容:
在这里插入图片描述

然后自己把内容用Notepad++格式成这个样子,就是java文件里面导包那种格式,注意:有两行Opened标签开头的jar包,需要手动删除
在这里插入图片描述
然后精简把rt.jar(jdk默认)解压到一个文件夹,再然后用他的代码精简rt.jar,
就传三个参数:1.默认rt文件夹路径、2.class.txt路径、
3.精简后的放rt.jar文件的文件夹路径,完成然后自己把输出的rt所有文件夹文件打包为rt.jar(该文件夹内jar -cvf rt.jar *)就行了,然后我看确实少了很多,53M变成了几百kb,然后就去运行,结果Could not find or load main class ,
然后去看他代码,唉,这啥啊,太复杂了不想去看,一大堆也不写注释,还让我复制了两个类,
然后我自己根据他的思路写了个,我也不想写注释了:

public class FileCopy {
	public static void main( String[] args )
	{
		String	sourceFolder	= "C:\\Users\\16500\\Desktop\\Test\\RT";    /* rt.jar 解压后的文件夹绝对路径 */
		String	targetFolder	= "C:\\Users\\16500\\Desktop\\Test\\newJre";    /*复制到指定的文件夹 */
		String	calsstxtPath	= "C:\\Users\\16500\\Desktop\\Test\\class.txt"; /* class.txt的绝对路径 */

		try {
			parseCopy( sourceFolder, targetFolder, calsstxtPath );
			/*
			 * 如果报类找不到的异常,那就是你rt.jar里面没有你用的那个类,你可以解压那个jar把文件夹放到rt文件夹再次运行
			 * sun\nio\cs\ext\ExtendedCharsets.class  这个类在lib\charsets.jar
			 * [Opened C:\Program Files\Java\jre1\8\0_251\lib\charsets\jar]这一行在class.txt中间
			 */
		} catch ( IOException e ) {
			e.printStackTrace();
		}
		System.out.println( "Output Done!.Please check" );
	}


	/**
	 *
	 * @param sourceFolder rt.jar解压后的目录文件夹
	 * @param targetFolder 复制目的地文件夹
	 * @param calsstxtPath 加载出的依赖class文件
	 * @throws IOException
	 */
	private static void parseCopy( String sourceFolder, String targetFolder,
				       String calsstxtPath ) throws IOException
	{
		/* 1.读取class.txt每行 作为地址 */
		List<String> linePath = parseClasstxt( calsstxtPath );
		for ( String filepath  : linePath )
		{
			/* 2.读取目标资源文件夹文件并复制到指定位置 */
			fileCopy( sourceFolder, targetFolder, filepath );
		}
	}


	/**
	 * 返回读取的文本行  路径字符串
	 * @param filepath  class.txt每一行内容
	 * @return
	 */
	private static String getFilePath( String filepath )
	{
		String[] str = filepath.split( "\\." );
		String res = "";
		/* 增加新字符串数组长度+1.用作下面的条件判断 */
		String[] newStr = new String[str.length + 1];
		for ( int i = 0; i < str.length; i++ )
		{
			newStr[i] = str[i];
		}
		for ( int j = 0; j < newStr.length - 1; j++ )
		{
			if ( newStr[j + 1] != null )
			{
				/* 没到最后一个就是路径文件夹 */
				res += newStr[j] + File.separator;
			}else{
				/* 否则就是编译后的类 */
				res += newStr[j] + ".class";
			}
		}
		return(File.separator + res);
	}


	private static void fileCopy( String sourceFolder, String targetFolder, String lineContext ) throws IOException
	{
		FileInputStream in		= new FileInputStream( sourceFolder + getFilePath( lineContext ) );
		String		linePath	= getFilePath( lineContext ); /* class.txt的每行内容换成/开头的路径 */
		/* 输出文件之前先把class文件父级目录创建出来 */
		File file = new File( targetFolder + linePath.substring( 0, linePath.lastIndexOf( File.separator ) ) );
		if ( !file.exists() )
		{
			file.mkdirs();
		}
		FileOutputStream	out		= new FileOutputStream( targetFolder + linePath );
		int			totalLength	= in.available();
		byte[] buffer = new byte[totalLength];
		in.read( buffer );
		out.write( buffer );
		out.close();
		in.close();
	}


	private static List<String> parseClasstxt( String calsstxtPath ) throws IOException
	{
		List<String>	list	= new ArrayList<String>();
		FileInputStream in	= new FileInputStream( calsstxtPath );
		BufferedReader	bf	= new BufferedReader( new InputStreamReader( in ) );
		String		line	= "";
		while ( (line = bf.readLine() ) != null )
		{
			list.add( line );
		}
		bf.close();
		in.close();
		return(list);
	}
}

精简后:到860kb,然后也不行…
然后我又去找已经精简好的,唉,都要积分下载,我又没钱买,
我就去看了看我之前还有没有其他网络小工具也精简过jre,没有我就不整了直接给个100M吧
筛选了几个,找到一个能用的jre整合之后 30M左右,总算完事了,只是800多kb的rt.jar变成了8M多的rt.jar
在这里插入图片描述

我把我这个jre放到了百度云盘,打包后竟然只有11M,
注意:这些环境我是根据我这个小工具相关打包的(网络相关),你的小工具说不定不一定能用,缺的少自己加上就行,多就还是自己整合吧,其实我还是想上面那种方法整合,有大佬如果按上面的方法整成功了麻烦告诉一下哎。
链接:https://pan.baidu.com/s/1XQsqshPQnPTyh3rRepjOhg
提取码:ttiw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值