gpt4 book ai didi

java - 在运行时加载资源包

转载 作者:行者123 更新时间:2023-12-02 12:26:23 24 4
gpt4 key购买 nike

这就是我想要实现的目标。我们有一个应用程序作为 servlet 在 IBM Domino 服务器上运行。该应用程序使用资源包根据浏览器语言获取翻译后的消息和标签。

我们希望客户能够覆盖某些值。我们无法在运行时修改.jar 中的bundle_lang.properties 文件。因此,我们的想法是提供额外的bundleCustom_lang.properties 文件以及.jar

这个包可以在运行时使用

加载
private static void addToClassPath(String s) throws Exception {
File file = new File(s);
URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader();
java.lang.reflect.Method m = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
m.setAccessible(true);
m.invoke(cl, new Object[] { file.toURI().toURL() });
}

到目前为止,一切顺利,这可以在 Eclipse 中运行。这里我将bundleCustom文件放在工作区之外的目录中(/volumes/DATA/Temp/)

一旦添加的 ResourceBundle 可用,我们首先检查该包的 key 。如果它返回一个值,则该值将用于翻译。如果没有返回值,或者文件不存在,则使用 .jar 内的 bundle 中的值。

我的完整代码在这里

public class BundleTest2 {

static final String CUSTOM_BUNDLE_PATH = "/volumes/DATA/Temp/";
static final String CUSTOM_BUNDLE_MODIFIER = "Custom";

public static void main(String[] args) {
try {
addToClassPath(CUSTOM_BUNDLE_PATH);

System.out.println(_getTranslation("LabelBundle", "OutlineUsersAllVIP"));
} catch (Exception e) {
}
}



private static String _getTranslation(String bundle, String translation) {
return _getTranslation0(bundle, new Locale("de"), translation);
}

private static String _getTranslation0(String bundle, Locale locale, String key) {
String s = null;
try {
try {
ResourceBundle custom = ResourceBundle.getBundle(bundle + CUSTOM_BUNDLE_MODIFIER, locale);
if (custom.containsKey(key)) {
s = custom.getString(key);
}
} catch (MissingResourceException re) {
System.out.println("CANNOT FIND CUSTOM RESOURCE BUNDLE: " + bundle + CUSTOM_BUNDLE_MODIFIER);
}

if (null == s || "".equals(s)) {
s = ResourceBundle.getBundle(bundle, locale).getString(key);
}
} catch (Exception e) {
}
return s;
}

private static void addToClassPath(String s) throws Exception {
File file = new File(s);
URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader();
java.lang.reflect.Method m = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
m.setAccessible(true);
m.invoke(cl, new Object[] { file.toURI().toURL() });
}
}

当我在 servlet 内部尝试相同的操作时,我收到 MissingResourceException。

我还尝试将.properties 文件放入customization.jar 中,并在调用addToClassPath() 时提供完整路径(包括.jar)。显然,customization.jar 已加载(它被锁定在文件系统中),但我仍然收到 MissingResourceException。

我们已经在 addToClassPath 中使用相同的代码来加载 Db2 驱动程序,并且这按预期工作。

我错过了什么?

最佳答案

为什么不使用数据库来存储覆盖的翻译?在应用程序的本地部署中保留客户端创建的内容通常不是一个好主意,如果重新部署应用程序会发生什么,这些资源会被删除吗?如果您必须运行应用程序的另一个节点怎么办,您将如何复制自定义属性文件?

关于java - 在运行时加载资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45454246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com