JRE精简

关于JRE精简,greenvm是一个国人写的Java软件(具体用法参考:精简jre体积),可以实现精简rt.jar文件的功能。

SF上也有人提问:A minimal Stripped Down JRE for Windows,但是回答中推荐的那些方案似乎都不大靠谱。

手工精简JRE,是一个比较费时的活,很笨的做法是一个个的筛选剔除JRE中的内容然后重新运行程序来测试是否正常。

这种方法虽然繁琐但是可行,一劳永逸,以防止后期出现莫名其妙的错误。精简JRE的目标是可以稳定运行目标程序,

我的Java程序使用到了NIO、JDBC、序列化还有加密等等核心功能,下面是精简JRE过程中遇到的一些问题:


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


最终精简JRE包含的文件目录结构如下(其中lib/zi是空文件夹):


JRE
├─bin
│  │  java.dll
│  │  java.exe
│  │  management.dll
│  │  msvcr100.dll
│  │  net.dll
│  │  nio.dll
│  │  verify.dll
│  │  zip.dll
│  │  
│  └─client
│          jvm.dll
│          
└─lib
    │  charsets.jar
    │  currency.data
    │  jce.jar
    │  jsse.jar
    │  resources.jar
    │  rt.jar
    │  tzmappings
    │  
    ├─ext
    │      sunjce_provider.jar
    │      
    ├─i386
    │      jvm.cfg
    │      
    ├─security
    │      local_policy.jar
    │      US_export_policy.jar
    │      
    └─zi

转载于:https://my.oschina.net/cwalet/blog/312052

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值