Java 从类路径加载ResourceBundle

Java 从类路径加载ResourceBundle,java,classpath,resourcebundle,Java,Classpath,Resourcebundle,我有两个jar文件。其中一个jar需要从另一个jar读取语言包。这是两个罐子的基本结构 jar1 |--com.example.BundleLoader jar2 |--strings |--language.properties |--language_fr.properties jar1 |--com.example.BundleLoader 罐子2 |--弦 |--语言属性 |--语言属性 语言包位于类路径上。为了阅读Bundle

我有两个jar文件。其中一个jar需要从另一个jar读取语言包。这是两个罐子的基本结构

jar1 |--com.example.BundleLoader jar2 |--strings |--language.properties |--language_fr.properties jar1 |--com.example.BundleLoader 罐子2 |--弦 |--语言属性 |--语言属性 语言包位于类路径上。为了阅读BundleLoader的语言包,我尝试将ResourceBundle与ClassLoader结合使用。 这就是我试图做到的

private ResourceBundle englishStrings = null;
private ResourceBundle frenchStrings = null;

System.out.println("About to load url from classpath for properties file " + bundleLocation);
URL url = ClassLoader.getSystemResource(bundleLocation);
bundleLocation = url.toString();
System.out.println("Ok loaded it");
System.out.println("url is " + (url == null ? "not available" : url.toString())); // Got the folder location

try {
    URL[] urls = { new URL(bundleLocation) }; // created array of ULRs to be loaded by URLClassLoader
    englishStrings = ResourceBundle.getBundle("validationStrings", Locale.getDefault(),
            new URLClassLoader(urls)); // Exception here
    frenchStrings = ResourceBundle.getBundle("validationStrings", Locale.FRENCH, 
            new URLClassLoader(urls));
} catch (MalformedURLException e1) {
    e1.printStackTrace();
}
<--End of Snippet-->
private ResourceBundle EnglishString=null;
私有ResourceBundle FrenchString=null;
System.out.println(“即将从属性文件的类路径加载url”+bundleLocation);
URL=ClassLoader.getSystemResource(bundleLocation);
bundleLocation=url.toString();
System.out.println(“Ok加载了它”);
System.out.println(“url是”+(url==null?“不可用”:url.toString());//获取文件夹位置
试一试{
URL[]URL={newURL(bundleLocation)};//创建了要由URLClassLoader加载的ULR数组
EnglishString=ResourceBundle.getBundle(“ValidationString”,Locale.getDefault(),
新建URLClassLoader(URL));//此处出现异常
FrenchString=ResourceBundle.getBundle(“ValidationString”,Locale.FRENCH,
新的URLClassLoader(URL));
}捕获(格式错误的异常e1){
e1.printStackTrace();
}
我得到的例外是

java.lang.ExceptionInInitializerError
    at com.example.Model.model.dObject.doCommon(dObject.java:70)
    at com.example.Model.model.dObject.validate(dObject.java:42)
    at com.example.Model.model.test.dObjectTest.testChpValidate(dObjectTest.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.util.MissingResourceException: Can't find bundle for base name validationStrings, locale en_CA
    at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:1028)
    at com.example.util.Strings.<init>(Strings.java:51)
    at com.example.util.Strings.<clinit>(Strings.java:26)
    ... 27 more
java.lang.ExceptionInInitializeError
位于com.example.Model.Model.dObject.docomon(dObject.java:70)
位于com.example.Model.Model.dObject.validate(dObject.java:42)
位于com.example.Model.Model.test.dObjectTest.testChpValidate(dObjectTest.java:49)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:47)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因:java.util.MissingResourceException:找不到基本名称验证字符串的捆绑包,区域设置en_CA
位于java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
位于java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
位于java.util.ResourceBundle.getBundle(ResourceBundle.java:1028)
位于com.example.util.Strings。(Strings.java:51)
位于com.example.util.Strings。(Strings.java:26)
... 还有27个
基本上,即使属性文件在文件夹中,我也找不到捆绑包。有人碰到过这个吗?我想以前有人处理过这件事


谢谢。

ResourceBundle.getBundle(“validationStrings”,Locale.FRENCH)
将在类路径上的任何JAR中直接在根目录下查找名为
validationStrings\u fr.properties
的文件。如果找不到,它将尝试
validationStrings.properties

如果您无法更改语言包JAR的结构,请尝试将整个第二个代码段替换为

this.englishStrings = ResourceBundle.getBundle("strings.language");
this.frenchStrings = ResourceBundle.getBundle("strings.language", Locale.FRENCH);

englishStrings
行将查找文件
strings/language_en_CA.properties
(假设默认区域设置为
en_CA
),然后在找不到该文件时返回到
strings/language.properties
frenchStrings
行将查找
strings/language\u fr.properties
ResourceBundle.getBundle(“validationStrings”,Locale.FRENCH)
将在类路径上的任何JAR中直接在根目录下查找名为
validationStrings\u fr.properties
的文件。如果找不到,它将尝试
validationStrings.properties

如果您无法更改语言包JAR的结构,请尝试将整个第二个代码段替换为

this.englishStrings = ResourceBundle.getBundle("strings.language");
this.frenchStrings = ResourceBundle.getBundle("strings.language", Locale.FRENCH);

englishStrings
行将查找文件
strings/language_en_CA.properties
(假设默认区域设置为
en_CA
),然后在找不到该文件时返回到
strings/language.properties
frenchStrings
行将查找
strings/language\u fr.properties

Oops划伤了我之前的评论,没有注意到那些点。它们很重要。我有斜线,这就是它不起作用的原因。我认为它需要点,所以你可以使用类名dir