前文
最近写了一个基于登录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