È la vostra scelta. Esistono sostanzialmente tre modi in un archivio di applicazioni Web (WAR) Java:
1. Mettilo nel percorso di classe
In modo che tu possa caricarlo ClassLoader#getResourceAsStream()
con un percorso relativo al classpath:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Qui foo.properties
dovrebbe essere collocato in una delle radici che sono coperte dal percorso di classe predefinito di una webapp, ad esempio webapp /WEB-INF/lib
e /WEB-INF/classes
, server /lib
o JDK / JRE /lib
. Se il file delle proprietà è specifico di webapp, è consigliabile inserirlo /WEB-INF/classes
. Se stai sviluppando un progetto WAR standard in un IDE, rilascialo nella src
cartella (la cartella di origine del progetto). Se stai usando un progetto Maven, lascialo nella /main/resources
cartella.
In alternativa puoi anche metterlo da qualche parte fuori dal percorso di classe predefinito e aggiungere il suo percorso al percorso di classe del server applicazioni. Ad esempio, Tomcat è possibile configurarlo come shared.loader
proprietà di Tomcat/conf/catalina.properties
.
Se lo hai inserito foo.properties
in una struttura di pacchetto Java come com.example
, allora devi caricarlo come di seguito
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Si noti che questo percorso di un caricatore di classi di contesto non deve iniziare con a /
. Solo quando stai usando un caricatore di classe "relativo" come SomeClass.class.getClassLoader()
, allora devi davvero avviarlo con a /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Tuttavia, la visibilità del file delle proprietà dipende quindi dal caricatore di classi in questione. È visibile solo allo stesso caricatore di classi di quello che ha caricato la classe. Quindi, se la classe viene caricata ad es. Da un comune caricatore di classi del server anziché dal caricatore di classi webapp e il file delle proprietà si trova all'interno di webapp stesso, allora è invisibile. Il caricatore di classi di contesto è la scommessa più sicura in modo da poter posizionare il file delle proprietà "ovunque" nel percorso di classe e / o si intende essere in grado di sovrascrivere uno fornito dal server dalla webapp su.
2. Inseriscilo in un contenuto web
In modo che tu possa caricarlo ServletContext#getResourceAsStream()
con un percorso relativo al webcontent:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Si noti che ho dimostrato di posizionare il file nella /WEB-INF
cartella, altrimenti sarebbe stato accessibile al pubblico da qualsiasi browser web. Si noti inoltre che ServletContext
è in qualsiasi HttpServlet
classe appena accessibile dall'ereditato GenericServlet#getServletContext()
e in Filter
da FilterConfig#getServletContext()
. Nel caso in cui non sei in una classe servlet, di solito è solo iniettabile tramite @Inject
.
3. Inserirlo nel file system del disco locale
In modo da poterlo caricare nel solito java.io
modo con un percorso di file system del disco locale assoluto:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Nota l'importanza di utilizzare un percorso assoluto. I percorsi relativi del file system del disco locale sono assolutamente inutili in un'applicazione Web Java EE. Vedi anche il primo link "Vedi anche" di seguito.
Quale scegliere?
Basta valutare i vantaggi / gli svantaggi secondo la propria opinione sulla manutenibilità.
Se i file delle proprietà sono "statici" e non devono mai essere modificati durante il runtime, è possibile conservarli in WAR.
Se si preferisce poter modificare i file delle proprietà dall'esterno dell'applicazione Web senza la necessità di ricostruire e ridistribuire il WAR ogni volta, inserirlo nel percorso di classe all'esterno del progetto (se necessario aggiungere la directory al percorso di classe).
Se si preferisce essere in grado di modificare i file delle proprietà a livello di codice dall'interno dell'applicazione Web utilizzando il Properties#store()
metodo, inserirlo all'esterno dell'applicazione Web. Come Properties#store()
richiesto a Writer
, non è possibile andare in giro utilizzando un percorso del file system del disco. Tale percorso può a sua volta essere passato all'applicazione Web come argomento VM o proprietà di sistema. Per precauzione, non usare maigetRealPath()
. Tutte le modifiche nella cartella di distribuzione andranno perse durante una ridistribuzione per il semplice motivo che le modifiche non vengono riportate nel file WAR originale.
Guarda anche: