如何重新加载属性文件而不重新启动Tomcat

时间:2010-08-26 09:01:39

标签: java tomcat classloader

我使用以下方法从classpath加载属性文件:

    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 个答案:

答案 0 :(得分:5)

您可以使用支持Commons Configurationautomatic reloading之类的内容。

答案 1 :(得分:1)

您仍然可以使用Tomcat Manager重新加载您的应用程序。

答案 2 :(得分:0)

实际上,您的webapp确实可以在不同的点访问ServletContext。例如,您可以使用ServletRequest.getServletContext()或通过ServletContextEvent回调获得的ServletContextListener获取。


这有点偏离主题,但您应该意识到这段代码:

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没有 here 的性能优势,因为Java编译器会将连接编译为相同的代码。

如果连接涉及循环,则只需要使用StringBuilder