Servlets 在基于servlet的应用程序中,在何处放置和如何读取配置资源文件?

Servlets 在基于servlet的应用程序中,在何处放置和如何读取配置资源文件?,servlets,jakarta-ee,configuration,resources,properties-file,Servlets,Jakarta Ee,Configuration,Resources,Properties File,在我的web应用程序中,我必须向一组预定义的用户发送电子邮件,如finance@xyz.com,因此我希望将其添加到.properties文件中,并在需要时访问它。这是一个正确的程序吗?如果是,那么我应该把这个文件放在哪里?我使用的是Netbeans IDE,它有两个单独的文件夹,分别存放源文件和JSP文件。它只需要位于类路径中,即确保作为构建的一部分,它最终位于.war中的/WEB-INF/classes下。您可以使用源文件夹,因此无论何时构建,这些文件都会自动复制到classes目录 不要使

在我的web应用程序中,我必须向一组预定义的用户发送电子邮件,如finance@xyz.com,因此我希望将其添加到.properties文件中,并在需要时访问它。这是一个正确的程序吗?如果是,那么我应该把这个文件放在哪里?我使用的是Netbeans IDE,它有两个单独的文件夹,分别存放源文件和JSP文件。

它只需要位于类路径中,即确保作为构建的一部分,它最终位于.war中的/WEB-INF/classes下。

您可以使用源文件夹,因此无论何时构建,这些文件都会自动复制到classes目录

不要使用属性文件,而是使用XML文件

如果数据太小,甚至可以使用web.xml访问属性


请注意,这些方法中的任何一种都需要重新启动应用程序服务器才能反映更改。

这是您的选择。Java web应用程序归档战基本上有三种方式:

1.把它放在类路径中 因此,您可以使用类路径相对路径加载它:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
这里foo.properties应该放在webapp默认类路径覆盖的根目录中,例如webapp的/WEB-INF/lib和/WEB-INF/classes、server的/lib或JDK/JRE的/lib。如果属性文件是特定于webapp的,最好将其放置在/WEB-INF/classes中。如果您正在IDE中开发一个标准WAR项目,请将其放入项目的源文件夹src文件夹中。如果您使用的是Maven项目,请将其放到/main/resources文件夹中

您也可以将其放置在默认类路径之外的某个位置,并将其路径添加到appserver的类路径中。例如,在Tomcat中,您可以将其配置为Tomcat/conf/catalina.properties的shared.loader属性

如果您已经将foo.properties放置在一个Java包结构(如com.example)中,那么您需要按如下方式加载它

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
请注意,上下文类装入器的此路径不应以/开头。只有在使用相对类加载器(如SomeClass.class.getClassLoader)时,才需要使用/

但是,属性文件的可见性取决于所讨论的类装入器。它只对加载该类的类加载器可见。因此,如果类是由服务器公共类加载器而不是webapp类加载器加载的,并且属性文件位于webapp本身内部,那么它是不可见的。上下文类加载器是您最安全的选择,因此您可以将属性文件放在类路径中的任何位置,和/或您希望能够覆盖上的webapp提供的服务器

2.把它放在webcontent中 因此,您可以使用webcontent相对路径加载它:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
请注意,我已经演示了如何将文件放在/WEB-INF文件夹中,否则任何webbrowser都可以对其进行公共访问。还请注意,ServletContext位于任何HttpServlet类中,该类仅可由继承的和筛选的对象访问。如果您不在servlet类中,它通常只是通过@Inject注入的

3.把它放在本地磁盘文件系统中 因此,您可以使用绝对的本地磁盘文件系统路径以通常的java.io方式加载它:

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
请注意使用绝对路径的重要性。相对本地磁盘文件系统路径在JavaEEWeb应用程序中是绝对不允许的。另请参见下面的第一个链接

选择哪一个? 只需根据您自己对可维护性的看法权衡利弊即可

如果属性文件是静态的,并且在运行时不需要更改,那么您可以将它们保留在WAR中

如果您希望能够从web应用程序外部编辑属性文件,而无需每次重新构建和重新部署WAR,那么可以将其放入项目外部的类路径中(如果需要),将目录添加到类路径中

如果希望能够使用Propertiesstore方法从web应用程序内部以编程方式编辑属性文件,请将其置于web应用程序外部。由于Propertiesstore需要写入程序,因此不能使用磁盘文件系统路径。该路径可以作为VM参数或系统属性传递给web应用程序。作为预防措施。重新部署时,deploy文件夹中的所有更改都将丢失,原因很简单,这些更改不会反映在原始WAR文件中

另见:
例如:在web.xml文件中,标记

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

警告:如果您将配置文件放在WEB-INF/classes文件夹中,并且您的IDE(比如Eclipse)执行了清理/重建,它将核化您的配置文件,除非它们位于Java源目录中。巴卢斯克的回答在选项1中暗示了这一点,但我想强调一下

我了解到,如果在Eclipse中复制web项目,它会从任何源文件夹进行清理/重建。在我的例子中,我从POJOJava库中添加了一个链接的源目录,它将编译到WEB-INF/classes文件夹中。做cl 该项目中的ean/rebuild而不是web应用项目导致了相同的问题

我曾考虑将我的conf放在POJO src文件夹中,但这些conf都是针对第三方lib的,如Quartz或URLRewrite,它们位于WEB-INF/lib文件夹中,因此没有意义。我计划在开始使用时将其放在WebProjects src文件夹中进行测试,但该文件夹当前为空,并且其中包含conf文件似乎不美观


所以我投票赞成将conf文件放在WEB-INF/commonConfFolder/filename.properties中,紧挨着classes文件夹,这是Balus选项2

假设代码正在查找文件,例如app.properties。通过在tomcat的bin目录中创建setenv.sh,将该文件复制到任意目录,并将该目录添加到类路径

在tomcat的setenv.sh中,如果此文件不存在,请创建一个,tomcat将加载此setenv.sh文件。 !/垃圾箱/垃圾箱 CLASSPATH=$CLASSPATH:/home/user/config\u my\u prod/

您不应该在./webapps//WEB-INF/classes/app.properties中拥有属性文件

Tomcat类加载器将使用WEB-INF/classes中的加载器覆盖/

一本好书:

您好,谢谢您的想法,但它告诉我找不到指定的文件,是的,这是路径问题。如何提供放置在webpages文件夹中的路径,但无法访问它。文件未找到错误正在出现。如何设置路径如果您的文件最终位于WEB-INF/classes文件夹中,它会自动设置到类路径中我个人更喜欢将它放在项目外部的类路径中添加新路径到类路径中,你能举个例子吗?@Blankman他可能意味着创建一个新文件夹,将所有自定义配置文件放在那里,然后将该文件夹添加到类路径中。因此:1在某处创建一个名为“appconfs”的文件夹,可能是/etc/appconfs;2将该文件夹添加到app server/domain的类路径中。第二步是特定于应用服务器的,我认为没有通用的例子。Re:2:为什么WEB-INF/filename.properties和/WEB-INF/filename.properties在开始时都会注意到/的作用?有什么理由选择其中一个而不是另一个吗?我在过去的一天里一直在关注这个问题。我无法加载我的属性文件。我可以从两个地方加载它。一个是系统目录,一个是本地驱动器。它与localhost一起工作。但我想在amazon上部署它。@Techguy:当路径无效或资源实际上没有放在应该放的地方时,它将返回null。也许这是一个解决方案?如果你把你的配置文件放在WEB\U INF的子文件夹中,那么你如何访问它?我没有幸运地说'configFiles/prop.properties'好吧,这可以将属性文件放在'Java Resources/src/'下。它在我的一个包中不起作用,需要位于src的根目录下。您关于classes文件夹被核化的警告是一个值得关注的问题。