Jakarta ee 在应用程序运行时编辑WEB-INF中的资源

Jakarta ee 在应用程序运行时编辑WEB-INF中的资源,jakarta-ee,servlets,jsf-2,Jakarta Ee,Servlets,Jsf 2,我能够获得WEB-INF文件夹中资源的输入流,如下所示: ExternalContext externalContext = facesContext.getExternalContext(); InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml"); 现在我想在运行时编辑此文件,但我不知道如何覆盖该文件。 有没有比创建到绝对路径的FileOutputStream更好的方法?即使没有

我能够获得WEB-INF文件夹中资源的输入流,如下所示:

    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml");
现在我想在运行时编辑此文件,但我不知道如何覆盖该文件。
有没有比创建到绝对路径的FileOutputStream更好的方法?即使没有,我仍然需要一种方法来获取文件的绝对路径(WEB-INF文件夹的绝对路径)

对于具体问题,您可以获得文件的绝对路径,如下所示:

ExternalContext externalContext = facesContext.getExternalContext();
String realPath = externalContext.getRealPath("/WEB-INF/config.xml");
FileOutputStream output = new FileOutputStream(realPath);
// ...
至于具体的功能要求,可能存在两个主要问题:

  • 当容器配置为在内存中而不是在磁盘上展开WAR文件时,
    getRealPath()
    将返回
    null
    。这样就没有物理磁盘文件系统路径。无法获得指向内存中位置的“文件路径”

  • 即使返回有效路径,只要重新部署WAR,在本地磁盘文件系统的扩展WAR结构中所做的所有更改都将丢失,甚至在某些服务器配置中,也会在重新启动服务器时丢失。原因很简单,这些更改不包含在原始WAR文件中。您基本上需要提取WAR,在其中进行更改,再次打包WAR并触发服务器的重新部署。这在运行时没有意义

  • 换句话说,你在错误的方向上寻找解决方案。您需要准备一个固定的本地磁盘文件系统路径,并改为对其进行读/写操作。另一种方法是使用SQL数据库,或者非常可能

    另见:

    为什么您需要过度信任xml文件?您无法编辑正在使用的文件!!谢谢你的回答。我决定使用固定的文件系统路径