Seçim senin. Bir Java web uygulaması arşivinde (WAR) temel olarak üç yol vardır:
1. Sınıf yoluna koy
Böylece ClassLoader#getResourceAsStream()
sınıf yoluna bağlı bir yolla yükleyebilirsiniz :
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Burada foo.properties
, bir web uygulamasının varsayılan sınıfyolunun (ör. Webapp /WEB-INF/lib
ve /WEB-INF/classes
sunucu /lib
, JDK / JRE) kapsanan köklerden birine yerleştirilmesi gerekir /lib
. Propertiesfile webapp-özgü ise, en iyisi onu yerleştirmektir /WEB-INF/classes
. IDE'de standart bir WAR projesi geliştiriyorsanız src
, projeye (projenin kaynak klasörü) bırakın . Bir Maven projesi kullanıyorsanız projeye bırakın/main/resources
klasöre .
Alternatif olarak, varsayılan sınıfyolunun dışında bir yere koyabilir ve yolunu uygulama sunucusunun sınıfyoluna ekleyebilirsiniz. Örneğin Tomcat'i shared.loader
özelliği olarak yapılandırabilirsiniz Tomcat/conf/catalina.properties
.
foo.properties
Bir Java paket yapısına yerleştirdiyseniz,com.example
aşağıdaki gibi yüklemeniz gerekir
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Bağlam sınıfı yükleyicinin bu yolunun a ile başlamaması gerektiğini unutmayın /
. Yalnızca "göreceli" sınıf yükleyiciyi kullandığınızda SomeClass.class.getClassLoader()
, gerçekten bir/
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Ancak, özellikler dosyasının görünürlüğü söz konusu sınıf yükleyiciye bağlıdır. Yalnızca sınıfı yükleyenle aynı sınıf yükleyicisi tarafından görülebilir. Bu nedenle, sınıf webapp sınıf yükleyicisi yerine sunucu ortak sınıf yükleyicisi tarafından yüklenirse ve özellikler dosyası web uygulamasının kendisindeyse, görünmez olur. Bağlam sınıfı yükleyicisi en güvenli bahistir, bu nedenle sınıf dosyasına "her yerde" özellikler dosyasını yerleştirebilir ve / veya sunucu tarafından sağlanan bir web uygulamasından geçersiz kılmayı düşünebilirsiniz.
2. Web içeriğine koyun
Böylece, web ServletContext#getResourceAsStream()
içerik göreli bir yolla yükleyebilirsiniz :
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Dosyayı /WEB-INF
klasöre yerleştirdiğimi gösterdim , aksi takdirde herhangi bir webbrowser tarafından halka açık olurdu. Ayrıca unutmayın ServletContext
herhangi bir HttpServlet
miras ile sadece erişilebilir sınıfta GenericServlet#getServletContext()
ve Filter
tarafından FilterConfig#getServletContext()
. Bir sunucu uygulaması sınıfında değilseniz, genellikle sadece enjekte edilebilir @Inject
.
3. Yerel disk dosya sistemine yerleştirin
Böylece, java.io
mutlak bir yerel disk dosya sistemi yolu ile her zamanki gibi yükleyebilirsiniz :
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Mutlak yol kullanmanın önemine dikkat edin. Göreli yerel disk dosya sistemi yolları, bir Java EE web uygulamasında mutlak hareketsizdir. Ayrıca aşağıdaki ilk "Ayrıca bkz." Bağlantısına bakın.
Hangisini seçmeli?
Sadece içeri avantajları / dezavantajları tartmak senin yönetilebilirliğinin kendi görüşünü.
Özellikler dosyaları "statik" ise ve çalışma zamanı sırasında hiçbir zaman değişmeleri gerekmiyorsa, bunları SAVAT'ta tutabilirsiniz.
Her seferinde WAR'ı yeniden oluşturmaya ve yeniden konuşlandırmaya gerek kalmadan özellik dosyalarını web uygulamasının dışından düzenlemeyi tercih ediyorsanız, projenin dışındaki sınıf yoluna yerleştirin (gerekirse dizini sınıf yoluna ekleyin).
Özellik dosyalarını Properties#store()
yöntem kullanarak web uygulamasının içinden programlı olarak düzenleyebilmeyi tercih ediyorsanız, dosyayı web uygulamasının dışına yerleştirin. A'nın Properties#store()
gerektirdiği gibi, Writer
bir disk dosya sistemi yolu kullanarak dolaşamazsınız. Bu yol da bir VM argümanı veya sistem özelliği olarak web uygulamasına aktarılabilir. Önlem olarak, asla kullanmayıngetRealPath()
. Konuşlandırma klasöründeki tüm değişiklikler, değişikliklerin orijinal WAR dosyasına geri yansıtılmaması nedeniyle yeniden dağıtımda kaybolur.
Ayrıca bakınız: