In my web application I have to send email to set of predefined users like finance@xyz.com
, so I wish to add that to a .properties
file and access it when required. Is this a correct procedure, if so then where should I place this file? I am using Netbeans IDE which is having two separate folders for source and JSP files.
相关问题
- slurm: use a control node also for computing
- Creating Unknown Number of Beans With Configuratio
- Change value of R.string programmatically?
- how to create files under /WEB-INF/
- Unity3D loading resources after build
相关文章
- java.lang.NoClassDefFoundError: javax/servlet/http
- Forward request from servlet to jsp
- Intercept @RequestHeader exception for missing hea
- How to check Android Asset resource?
- Are resource files compiled as UNICODE or ANSI cod
- Integrating Jetty with RESTEasy
- How to use relative line numbering universally in
- How to abort Tomcat startup upon exception in Serv
It's your choice. There are basically three ways in a Java web application archive (WAR):
1. Put it in classpath
So that you can load it by
ClassLoader#getResourceAsStream()
with a classpath-relative path:Here
foo.properties
is supposed to be placed in one of the roots which are covered by the default classpath of a webapp, e.g. webapp's/WEB-INF/lib
and/WEB-INF/classes
, server's/lib
, or JDK/JRE's/lib
. If the propertiesfile is webapp-specific, best is to place it in/WEB-INF/classes
. If you're developing a standard WAR project in an IDE, drop it insrc
folder (the project's source folder). If you're using a Maven project, drop it in/main/resources
folder.You can alternatively also put it somewhere outside the default classpath and add its path to the classpath of the appserver. In for example Tomcat you can configure it as
shared.loader
property ofTomcat/conf/catalina.properties
.If you have placed the
foo.properties
it in a Java package structure likecom.example
, then you need to load it as belowNote that this path of a context class loader should not start with a
/
. Only when you're using a "relative" class loader such asSomeClass.class.getClassLoader()
, then you indeed need to start it with a/
.However, the visibility of the properties file depends then on the class loader in question. It's only visible to the same class loader as the one which loaded the class. So, if the class is loaded by e.g. server common classloader instead of webapp classloader, and the properties file is inside webapp itself, then it's invisible. The context class loader is your safest bet so you can place the properties file "everywhere" in the classpath and/or you intend to be able to override a server-provided one from the webapp on.
2. Put it in webcontent
So that you can load it by
ServletContext#getResourceAsStream()
with a webcontent-relative path:Note that I have demonstrated to place the file in
/WEB-INF
folder, otherwise it would have been public accessible by any webbrowser. Also note that theServletContext
is in anyHttpServlet
class just accessible by the inheritedGenericServlet#getServletContext()
and inFilter
byFilterConfig#getServletContext()
. In case you're not in a servlet class, it's usually just injectable via@Inject
.3. Put it in local disk file system
So that you can load it the usual
java.io
way with an absolute local disk file system path:Note the importance of using an absolute path. Relative local disk file system paths are an absolute no-go in a Java EE web application. See also the first "See also" link below.
Which to choose?
Just weigh the advantages/disadvantages in your own opinion of maintainability.
If the properties files are "static" and never needs to change during runtime, then you could keep them in the WAR.
If you prefer being able to edit properties files from outside the web application without the need to rebuild and redeploy the WAR every time, then put it in the classpath outside the project (if necessary add the directory to the classpath).
If you prefer being able to edit properties files programmatically from inside the web application using
Properties#store()
method, put it outside the web application. As theProperties#store()
requires aWriter
, you can't go around using a disk file system path. That path can in turn be passed to the web application as a VM argument or system property. As a precaution, never usegetRealPath()
. All changes in deploy folder will get lost on a redeploy for the simple reason that the changes are not reflected back in original WAR file.See also:
Ex: In web.xml file the tag
And chat.properties you can declare your properties like this
For Ex :
It just needs to be in the classpath (aka make sure it ends up under /WEB-INF/classes in the .war as part of the build).
You can you with your source folder so whenever you build, those files are automatically copied to the classes directory.
Instead of using properties file, use XML file.
If the data is too small, you can even use web.xml for accessing the properties.
Please note that any of these approach will require app server restart for changes to be reflected.
Assume your code is looking for the file say app.properties. Copy this file to any dir and add this dir to classpath, by creating a setenv.sh in the bin dir of tomcat.
In your setenv.sh of tomcat( if this file is not existing, create one , tomcat will load this setenv.sh file.
#!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"
You should not have your properties files in ./webapps//WEB-INF/classes/app.properties
Tomcat class loader will override the with the one from WEB-INF/classes/
A good read: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
Word of warning: if you put config files in your
WEB-INF/classes
folder, and your IDE, say Eclipse, does a clean/rebuild, it will nuke your conf files unless they were in the Java source directory. BalusC's great answer alludes to that in option 1 but I wanted to add emphasis.I learned the hard way that if you "copy" a web project in Eclipse, it does a clean/rebuild from any source folders. In my case I had added a "linked source dir" from our POJO java library, it would compile to the
WEB-INF/classes
folder. Doing a clean/rebuild in that project (not the web app project) caused the same problem.I thought about putting my confs in the POJO src folder, but these confs are all for 3rd party libs (like Quartz or URLRewrite) that are in the
WEB-INF/lib
folder, so that didn't make sense. I plan to test putting it in the web projects "src" folder when i get around to it, but that folder is currently empty and having conf files in it seems inelegant.So I vote for putting conf files in
WEB-INF/commonConfFolder/filename.properties
, next to the classes folder, which is Balus option 2.