精简jre

因自己做一个小程序,打包为jar,编译为exe后,exe运行需要依赖java运行环境,也就是说exe和jre必须在一起。但是官网下载的jre有一百多兆,而我的exe只有几百k,因此要精简jre,删除程序不需要的部分。

  1. 精简jre

做jre/bin精简时,找了许多方法,有说使用360任务管理器查看进程使用的dll的,我试了一下,不太好用,精简完成后,一直提示找不到java运行环境;

做jre/lib精简时,找到一个方法:写脚本,输出进程使用的lib

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

最终实现

上述方式感觉都很有道理,但就是不适用于我的情况。后来选择了最笨的方式,先用完整的jre运行exe,程序不要停,然后做分段式删除,正在使用的文件如果被删除会有提示。

之所以做分段式删除,而不是全选删除,依靠提示保留所需文件,是因为,有些文件可以被删除,但删除后再运行exe又会报错;分段式删除操作后,重启exe,如果启动失败,则恢复刚刚删除的文件,再缩小范围执行删除。

  1. 运行异常解决

按照上述方式精简后,exe可以正常启动,但运行时会出现一些报错。出现报错可参考下列解决办法。

(转自:https://blog.csdn.net/weixin_34150503/article/details/91759106)

1.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“RSA premaster secret error

  • 异常“不支持此服务器版本。目标服务器必须是 SQL Server 2000 或更高版本问题解决”

  • 原因:用sqljdbc.jar访问SQL Server 2008时发生。

  • 解决:用SQL Server新版本的JDBC类库sqljdbc4.jar替换旧版本的sqljdbc.jar。

  • 异常“com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“RSA premaster secret error”。”

  • 原因:SQL Server 的JDBC jar包连接SQL Server 2008时无法建立SSL安全连接,在类路径里缺少sunjce_provider.jar包。

  • 解决:sunjce_provider.jar一般在jre\lib\ext目录下,将其包含在CLASSPATH路径里。

参考: SQL Server JDBC 访问 SQL Server 2008 异常 JDBC连接SQL server 2005 驱动

2.NoClassDefFoundError: javax/crypto/BadPaddingException

解决方法如下(在linux中运行):

find / -name *.jar | while read f; do    (jar tf $f | grep BadPaddingException && echo $f) &done

找到/usr/local/java/jre/lib/ jce.jar,然后放入精简JRE的lib目录中即可。

3.java.lang.SecurityException: SHA MessageDigest not available

Update 3: the -verbose:class showed that the package sun.security.provider and more does not get loaded. I dont know why though, because both alternatives are loading classes from jsse.jar where the missing package comes from, and both print [Opened C:\Program Files\Java\jre7\lib\jsse.jar]

weird behaviour of custom system classloader and MessageDigest

上文提到了jsse.jar,SUN的SHA消息摘要算法实现是在此包,程序的加密功能依赖。

4.Could not initialize class javax.crypto.JceSecurity

JIRA throws exception 'Could not initialize class javax.crypto.SunJCE_b'

原因:JVM在加载加密包时出错。

方案:确保以下jar包处于JRE_HOME目录中

  • JRE/lib/security/local_policy.jar

  • JRE/lib/security/US_export_policy.jar

5.java.lang.UnsatisfiedLinkError: no management in java.library.path

解决:add management.dll to jre\bin

6.MissingResourceException: Can't find bundle for base name com/sun/rowset/RowSetResourceBundle

原因:jre/lib/resources.jar contains the correct resource files

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. 在bin目录中新建一个temp目录,将除java.exe和java.dll外的移到temp目录中 5. 再次运行java –version命令,提示没找到verify.dll。将temp目录中的verify.dll移到bin目录中 6. 再次运行 java –version命令,提示:Could not create the Java virtual machine.错误 7. 根据测试:还要将hpi.dll和zip.dll放到bin目录中 8. 再次运行java –version命令,OK,又出现了版本信息。此时,可以将temp目录移出bin目录中。(放到桌面先) 9. 删除client目录中的除jvm.dll外的文件。转到jre目录,查看bin目录的大小,为2.89MB。但此时lib目录仍有60M有余 10. 转到lib目录,新建一个temp目录,将i386除外的目录都移动到temp目录中,再次运行java –version命令,OK 11. 再新建一个temp2目录,将charsets.jar和rt.jar外的所有文件移动到temp2目录中,再次运行 Java –version命令,OK 12. 将temp2和temp目录移到桌面。此时lib仍有48.7M接近50M。(还得努力) 13. 缩减charsets.jar和rt.jar(使用7z工具可以查看和修改jar文件的内容『直接添加和删除』)。准备做个软件来实现。 14. 缩减原则。运行java -verbose:class -version > temp.java 命令,此时在bin目录下生成了一个temp.java文件,用EditPlus打开,看到没有,要加载的就是那些类了,把不需要的全部删除就是了。 15. 原来charsets.jar没有加载呀。直接删除,再次运行java –version命令,OK 16. 接下来的工作就是裁剪rt.jar了。慢慢来。也可以做个软件来完成。可以下载一个GreenJVMMake.jar来完成。不过有时候好像有些类没加载到。要考虑更新了。 17. 裁剪玩rt.jar后,再次运行java –version ,出现了版本信息。OK 18. 转到D盘查看一下精简jre才4.47MB。不到5M。OK 19. 最小的jre制作完毕。 附带制作过程图片,可用Picasa来查看,播放模式效果更佳。 Thoams 2010-6-25 15:53

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值