Це твій вибір. В архіві веб-додатків Java (WAR) в основному є три способи:
1. Помістіть його в класі
Так що ви можете завантажити його за ClassLoader#getResourceAsStream()
допомогою відносного шляху до класу:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Тут foo.properties
повинен бути розміщений один з коренів, які охоплені стандартним класовим маршрутом webapp, наприклад, webapp /WEB-INF/lib
і /WEB-INF/classes
, сервером /lib
, або JDK / JRE /lib
. Якщо файл властивостей є специфічним для webapp, найкраще розмістити його /WEB-INF/classes
. Якщо ви розробляєте стандартний проект WAR в IDE, опустіть його в src
папку (вихідна папка проекту). Якщо ви використовуєте проект Maven, опустіть його в /main/resources
папку.
Ви також можете помістити його десь за межами стандартного класу і додати його шлях до класного шляху додатка. Наприклад, Tomcat ви можете налаштувати його як shared.loader
властивість Tomcat/conf/catalina.properties
.
Якщо ви розмістили foo.properties
його у такій формі пакету Java com.example
, то вам потрібно завантажити його, як показано нижче
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Зауважте, що цей шлях завантажувача контекстного класу не повинен починатися з а /
. Тільки коли ви використовуєте завантажувач класу "відносного" типу SomeClass.class.getClassLoader()
, тоді вам дійсно потрібно запустити його з /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Однак видимість файлу властивостей залежить від відповідного завантажувача класів. Це видно лише тому ж завантажувачу класу, що і той, який завантажив клас. Отже, якщо клас завантажується, наприклад, загальним серверним завантажувачем сервера замість webapp classloader, а файл властивостей знаходиться всередині самого webapp, він невидимий. Завантажувач контекстного класу - це ваша найбезпечніша ставка, тому ви можете розмістити файл властивостей "скрізь" на classpath та / або ви маєте намір перемогти сервер із веб-сайту.
2. Помістіть це у веб-контент
Так що ви можете завантажити його шляхом ServletContext#getResourceAsStream()
відносного веб-контенту:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Зауважте, що я продемонстрував розміщення файлу в /WEB-INF
папці, інакше він був би загальнодоступним будь-яким веб-браузером. Також зауважте, що ServletContext
є в будь-якому HttpServlet
класі, просто доступному успадкованому GenericServlet#getServletContext()
та Filter
користувачеві FilterConfig#getServletContext()
. У випадку, якщо ви не входите до класу сервлетів, зазвичай це просто вводиться через @Inject
.
3. Помістіть його в файлову систему локального диска
Так що ви можете завантажити його звичайним java.io
способом за допомогою абсолютного контуру файлової системи на локальному диску:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Зверніть увагу на важливість використання абсолютного шляху. Відносні локальні шляхи до файлових систем диска є абсолютним неприйняттям веб-програми Java EE. Дивіться також перше посилання "Дивіться також" нижче.
Який вибрати?
Просто зважте переваги / недоліки на вашу власну думку щодо ремонту.
Якщо файли властивостей "статичні" і ніколи не потрібно змінювати їх під час виконання, ви можете зберегти їх у ВІЙНІ.
Якщо ви віддаєте перевагу можливості редагувати файли властивостей за межами веб-програми без необхідності щоразу перестроювати та повторно розміщувати WAR, тоді покладіть її на класний шлях за межами проекту (за потреби додайте каталог до classpath).
Якщо ви віддаєте перевагу можливості редагування файлів властивостей програмно зсередини веб-програми за допомогою Properties#store()
методу, поставте її поза веб-додатком. Як Properties#store()
вимагає a Writer
, ви не можете обійти шлях, використовуючи шлях до файлової системи диска. Цей шлях у свою чергу може бути переданий веб-додатку як аргумент VM або властивість системи. В якості запобіжних заходів ніколи не використовуйтеgetRealPath()
. Усі зміни в папці розгортання втрачаються при повторному застосуванні з тієї простої причини, що зміни не відображаються в оригінальному файлі WAR.
Дивитися також: