关于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