最近在用jboss部署项目,发现了同一项目在不同机器上运行有的机器好使,有的机器不好使。折磨了自己2天,最终找到原因是虚拟机上的JDK的问题。
事情是这样的:我们项目中加密方式涉及到了base64,该方法引用的是jdk中rt.jar中的方法。当我在甲服务器上运行项目,启动没问题,调用接口也正常。当我把甲上的项目拷贝到乙服务器上运行,启动正常。当解密的时候报Can't find bundle for base name com/sun/org/apache/xml/internal/security/resource/xmlsecurity, locale en_US,让我很诧异,因为我已经将rt.jar包放到项目的lib下面了。按理说不应该有问题,况且其他项目用的时候也正常。然后我就讲rt.jar包解压开查看,发现此包下真的没有resource/xmlsecurity。那么问题来了,是啥原因呢?上网搜了一下好多说是找不到所要获取的文件,没办法反编译rt.jar,发现com\sun\org\apache\xml\internal\security下有一个Init.class,将其反编译后有如下line 70 return super.getClass().getResourceAsStream("resource/config.xml");
我猜测应该是此文件没有找到。我就按照报错路径在项目里增加了此名的空文件,发现报错地方过去了。我恍然大悟,找到JDK,发现jdk下的jre/lib中果然还有另一个包:resources.jar。里面果然有需要的文件:config.xml和xmlsecurity_en.properties,将此包增加到乙机器的项目下,重启后都好使了。到此算是解决了加解密问题。但此时还是有个疑问,为什么linux上只需要rt.jar,有的linux上还需要jdk中的resource.jar呢,麻烦路过的大神讲解一下,感谢!!