如何在不重启Tomcat的情况下重新加载属性文件

3

我使用以下方法从类路径加载属性文件:

    String cheminFichier = new StringBuilder(100).append(classeBP.getPackage().getName().replace(".", "/")).append(File.separator).append(
        REPERTOIRE_MAPPING).append(nomFichier).append(".properties").toString();
    InputStream isMapping = Thread.currentThread().getContextClassLoader().getResourceAsStream(cheminFichier.toString());
    if (isMapping == null)
    {
        throw new ServiceMappingException("Erreur lors du chargement du mapping du service. Le fichier "
            + cheminFichier + " n'existe pas.");
    }
    else
    {
        Properties mapping = new Properties();
        try
        {
            mapping.load(isMapping);
        }
        catch (IOException e)
        ...
    }

好的,它可以工作。但是如果我在Tomcat运行时修改属性文件内容,则更改将被忽略。它不像类一样热重新加载。
我的上下文配置了reloadable="true"选项,并且由Thread.currentThread().getContextClassLoader()返回的类加载器是WEBAPP类加载器(而不是系统类加载器或其他)。
我读到可以使用ServletContext.getResourceAsStream,但我没有访问servlet上下文的权限。
这是Tomcat 5.5。
有什么想法吗?如果没有,您有强制重新加载特定资源(我的属性文件)的解决方案吗?
谢谢!
3个回答

5

2
您仍然可以使用Tomcat管理器重新加载您的应用程序。

4
是的,但这恰恰是我想要避免的。 我的应用程序启动大约需要1分钟,所以当我更改属性文件时,我不会重新加载整个应用程序。 - Albataur

0
实际上,您的 Web 应用程序在各个点都可以访问 ServletContext。例如,您可以使用 ServletRequest.getServletContext() 获取它,或者通过 ServletContextListener 回调获得的 ServletContextEvent 来获取它。

这有点跑题,但你应该意识到这段代码:

String cheminFichier = new StringBuilder(100).append(classeBP.getPackage().getName().replace(".", "/")).append(File.separator).append(
    REPERTOIRE_MAPPING).append(nomFichier).append(".properties").toString();

可以 / 应该这样编写:

String cheminFichier = classeBP.getPackage().getName().replace(".", "/")) +
    File.separator + REPERTOIRE_MAPPING + nomFichier + ".properties";

在这里明确使用 StringBuilder 并没有性能优势,因为 Java 编译器会将连接编译为相同的代码。

只有当连接涉及循环时才需要使用 StringBuilder


在离题的主题中,你不应该用法语编码,但这是另一个讨论话题。 - Colin Hebert
@Colin - 我不会那么说,但是用法英词典阅读Java确实有点尴尬。不过印度尼西亚语就没问题了 :-) - Stephen C
谢谢你的回答。我会尝试一下。关于StringBuilder,我不同意你的观点(也许我错了...)。我用100个字符初始化StringBuilder,这样当字符串增长时Java就不会重新分配内存,对吧?关于法语编码,我同意你的看法 :) 但是我没有写规则... - Albataur
1
@Abalataur - 关于StringBuilder,这取决于您估计的大小与实际大小有多接近。如果您的估计接近,则可能会稍微节省一些空间。如果不是,则不会。特别是,如果它显着大,则会损失很大。但无论如何,这种优化可能并不值得...除非分析告诉您不同。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接