Itu pilihanmu. Pada dasarnya ada tiga cara dalam arsip aplikasi web Java (PERANG):
1. Letakkan di classpath
Agar Anda dapat memuatnya ClassLoader#getResourceAsStream()
dengan jalur relatif classpath:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Di sini foo.properties
seharusnya ditempatkan di salah satu root yang dicakup oleh classpath default suatu webapp, misalnya webapp /WEB-INF/lib
dan /WEB-INF/classes
, server /lib
, atau JDK / JRE /lib
. Jika propertiesfile khusus webapp, yang terbaik adalah menempatkannya di /WEB-INF/classes
. Jika Anda mengembangkan proyek WAR standar dalam IDE, letakkan di src
folder (folder sumber proyek). Jika Anda menggunakan proyek Maven, letakkan di /main/resources
folder.
Anda juga dapat meletakkannya di suatu tempat di luar classpath default dan menambahkan pathnya ke classpath appserver. Sebagai contoh, Tomcat Anda dapat mengkonfigurasinya sebagai shared.loader
properti Tomcat/conf/catalina.properties
.
Jika Anda telah menempatkannya foo.properties
dalam struktur paket Java seperti com.example
, maka Anda perlu memuatnya seperti di bawah ini
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Perhatikan bahwa jalur pemuat kelas konteks ini tidak boleh dimulai dengan a /
. Hanya ketika Anda menggunakan loader kelas "relatif" seperti SomeClass.class.getClassLoader()
, maka Anda memang harus memulainya dengan a /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Namun, visibilitas file properti tergantung pada pemuat kelas yang dimaksud. Ini hanya dapat dilihat oleh loader kelas yang sama dengan yang memuat kelas. Jadi, jika kelas dimuat oleh misalkan server common classloader alih-alih webapp classloader, dan file properti ada di dalam webapp itu sendiri, maka itu tidak terlihat. Pemuat kelas konteks adalah taruhan teraman Anda sehingga Anda dapat menempatkan file properti "di mana saja" di classpath dan / atau Anda bermaksud untuk dapat menimpa yang disediakan server dari webapp.
2. Masukkan ke dalam konten web
Agar Anda dapat memuatnya ServletContext#getResourceAsStream()
dengan jalur relatif konten web:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Perhatikan bahwa saya telah menunjukkan untuk menempatkan file dalam /WEB-INF
folder, jika tidak maka file tersebut akan dapat diakses publik oleh browser web apa pun. Juga perhatikan bahwa ServletContext
ini ada di HttpServlet
kelas mana saja yang hanya dapat diakses oleh yang diwarisi GenericServlet#getServletContext()
dan Filter
oleh FilterConfig#getServletContext()
. Jika Anda tidak berada dalam kelas servlet, biasanya hanya bisa diinjeksi melalui @Inject
.
3. Masukkan ke dalam sistem file disk lokal
Sehingga Anda dapat memuatnya dengan java.io
cara biasa dengan jalur sistem file disk lokal mutlak:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Perhatikan pentingnya menggunakan jalur absolut. Jalur sistem file disk lokal relatif adalah jalan keluar mutlak dalam aplikasi web Java EE. Lihat juga tautan "Lihat juga" pertama di bawah.
Yang mana yang harus dipilih?
Hanya menimbang keuntungan / kerugian menurut pendapat Anda sendiri tentang perawatan.
Jika file properti bersifat "statis" dan tidak perlu diubah selama runtime, maka Anda dapat menyimpannya dalam PERANG.
Jika Anda lebih suka dapat mengedit file properti dari luar aplikasi web tanpa perlu membangun kembali dan menggunakan kembali PERANG setiap kali, kemudian letakkan di classpath di luar proyek (jika perlu tambahkan direktori ke classpath).
Jika Anda lebih suka mengedit properti file secara terprogram dari dalam aplikasi web menggunakan Properties#store()
metode, letakkan di luar aplikasi web. Karena Properties#store()
memerlukan Writer
, Anda tidak dapat berkeliling menggunakan jalur sistem file disk. Jalur itu pada gilirannya dapat diteruskan ke aplikasi web sebagai argumen VM atau properti sistem. Sebagai tindakan pencegahan, jangan pernah gunakangetRealPath()
. Semua perubahan dalam folder deploy akan hilang pada penempatan ulang karena alasan sederhana bahwa perubahan tidak tercermin kembali dalam file WAR asli.
Lihat juga: