Can't find bundle for base name com/sun/org/apache/xml/internal/security/resource/xmlsecurity, local

本文分享了一次解决Java项目中因JDK版本差异导致的资源加载失败问题的经历。通过对比不同服务器上的运行情况,逐步定位到问题所在,并提供了解决方案。

       最近在用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呢,麻烦路过的大神讲解一下,感谢!!



Java中使用`ResourceBundle`进行国际化资源加载时,如果出现找不到资源文件`i18n/platform-lang`的问题,通常与资源文件的路径、命名或`Locale`的设置有关。以下是一些常见的排查和解决方案: ### 资源文件路径与命名 确保资源文件的路径和命名符合Java的国际化资源加载规则。`ResourceBundle`通常会根据基础名称(base name)和`Locale`来查找对应的资源文件。 例如,如果基础名称为`i18n.platform-lang`,那么对于`en_US`的`Locale`,Java会尝试查找以下文件: - `i18n/platform-lang_en_US.properties` - `i18n/platform-lang_en.properties` - `i18n/platform-lang.properties`(默认资源文件) 如果这些文件不存在或路径不正确,`ResourceBundle`将无法找到对应的资源[^3]。 ### 示例代码 以下是一个使用`ResourceBundle`加载资源的示例代码: ```java import java.util.Locale; import java.util.ResourceBundle; public class ResourceBundleExample { public static void main(String[] args) { // 设置Locale为en_US Locale locale = new Locale("en", "US"); // 加载资源文件 ResourceBundle bundle = ResourceBundle.getBundle("i18n.platform-lang", locale); // 输出资源内容 System.out.println(bundle.getString("greeting")); } } ``` 确保资源文件位于类路径(classpath)中,并且文件名与`Locale`匹配。 ### 检查类路径 确保资源文件所在的目录或JAR包已正确添加到类路径中。如果资源文件位于项目的`src/main/resources`目录下,则构建工具(如Maven或Gradle)会自动将其复制到类路径中。 ### 调试与日志 在调试过程中,可以通过打印`ResourceBundle`的类名来确认加载的是哪个资源文件: ```java System.out.println("Loaded resource bundle: " + bundle.getClass().getName()); ``` ### Locale设置 确保`Locale`的设置正确。如果未显式指定`Locale`,`ResourceBundle`将使用默认的`Locale`。可以通过以下方式设置默认的`Locale`: ```java Locale.setDefault(new Locale("en", "US")); ``` ### 相关问题 1. 如何在Java中动态切换国际化资源? 2. 如何处理Java国际化资源文件的编码问题? 3. ResourceBundle在加载资源时如何处理缺失的键? 4. 如何在Spring框架中使用ResourceBundle进行国际化? 5. 如何测试Java国际化资源加载的正确性?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值