Pytanie Jakie jest najlepsze miejsce do przechowywania pliku konfiguracyjnego w aplikacji internetowej Java (WAR)?


Tworzę aplikację internetową (WAR) i wdrażam ją na Tomcat. w Aplikacja internetowa istnieje strona z formularzem, w którym administrator może wprowadzić dane konfiguracyjne. Nie chcę przechowywać tych danych w DBMS, ale tylko w pliku XML w systemie plików. Gdzie to umieścić?

Chciałbym umieścić plik gdzieś w drzewie katalogów, w którym sama aplikacja jest wdrażana. Czy mój plik konfiguracyjny powinien znajdować się w WEB-INF informator? Lub umieścić go gdzieś indziej?

A jaki jest kod Java do użycia w serwlecie, aby znaleźć absolutną ścieżkę katalogu? Czy można uzyskać do niego dostęp ze względną ścieżką?


54
2017-09-18 19:53


pochodzenie


Zauważ, że nie ma domyślnego mechanizmu dla silników serwletów - będziesz musiał określić konkretne założenia dostawcy. - Thorbjørn Ravn Andersen


Odpowiedzi:


Robimy to w oddzielnym katalogu na serwerze (możesz użyć czegoś takiego jak / config, / opt / config, / root / config, / home / nazwa_użytkownika / config, lub cokolwiek chcesz). Kiedy nasze serwlety się uruchamiają, odczytują plik XML, pobierają z niego kilka rzeczy (najważniejsze informacje o połączeniu DB) i to wszystko.

Zapytałem o to, dlaczego zrobiliśmy to raz.

Byłoby miło przechowywać wszystko w DB, ale oczywiście nie można przechowywać informacji o połączeniu DB w DB.

Możesz kodować rzeczy w kodzie, ale jest to brzydkie z wielu powodów. Jeśli informacje mają się kiedykolwiek zmienić, musisz przebudować kod i ponownie wdrożyć. Jeśli ktoś otrzyma kopię twojego kodu lub pliku WAR, otrzyma te informacje.

Umieszczenie rzeczy w pliku WAR wydaje się fajne, ale jeśli chcesz coś zmienić, może to być zły pomysł. Problem polega na tym, że jeśli trzeba zmienić informacje, to przy następnym ponownym wdrożeniu plik zostanie nadpisany, aby wszystko, co nie zostało zapamiętane w wersji wbudowanej w WAR, zostało zapomniane.

Plik w specjalnym miejscu na systemie plików działa całkiem dobrze dla nas. Nie ma większych wad. Wiesz, gdzie on jest, jest przechowywany osobno, sprawia, że ​​wdrażanie na wielu komputerach jest łatwe, jeśli wszystkie potrzebują różnych wartości konfiguracyjnych (ponieważ nie jest częścią WAR).

Jedynym innym rozwiązaniem, które może mi się przydać, byłoby zachowanie wszystkiego w DB z wyjątkiem danych logowania do DB. To pochodziłoby z właściwości systemu Java, które są pobierane przez maszynę JVM. To wspomnienie o API Preferencji wspomniane przez Hansa Doggena powyżej. Nie sądzę, aby było tak, kiedy nasza aplikacja została opracowana po raz pierwszy, gdyby nie była używana.

Jeśli chodzi o ścieżkę dostępu do pliku konfiguracyjnego, jest to po prostu plik w systemie plików. Nie musisz martwić się o ścieżkę sieciową. Więc kiedy twój serwlet uruchamia się, po prostu otwiera plik w "/config/myapp/config.xml" (lub cokolwiek innego) i znajdzie właściwą rzecz. Po prostu kodowanie ścieżki do tego wydaje mi się całkiem nieszkodliwe.


48
2017-09-18 20:15



Zamiast wskazywać pełną ścieżkę do pliku, możesz umieścić katalog "config" w ścieżce klasy dla serwera i po prostu użyć ClassLoader.getResource (). - John Meagher
Określamy właściwość systemu, gdy uruchomi się tomcat. Nasza aplikacja otrzymuje nasz katalog konfiguracyjny z tej właściwości systemu, więc możemy użyć innego katalogu konfiguracji z serwera na serwer. - ScArcher2
W aplikacji, nad którą właśnie pracuję, przechowujemy plik konfiguracyjny poza aplikacją w folderze znajdującym się w katalogu KATALOG_GŁÓWNY_ USER. Po uruchomieniu aplikacja pobiera plik z lokalizacji String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml"; - Nikola
mała uwaga: zgodnie z przewodnikiem po hierarchii systemów plików tldp.org/LDP/Linux-Filesystem-Hierarchy/html/opt.html, wszystkie pliki powinny być pod / opt / "pakiet" / config gdzie "pakiet" to nazwa twojego programu. - milan
Jak by to działało, jeśli masz wiele środowisk (na przykład testowanie i testowanie) działających w tym samym tomcat? Ponieważ nie można określić właściwości systemowej dla środowiska, gdy ma się tylko jeden tomcat. - AtliB


WEB-INF jest dobrym miejscem do umieszczenia pliku konfiguracyjnego. Oto kod, który pozwala uzyskać absolutną ścieżkę katalogu z serwletu.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

16
2017-09-18 20:19



To nie jest zgodne podejście - nie jest gwarantowane przez specyfikację serwletu, że getRealPath () zwróci poprawną (nie zerową) ścieżkę lub nawet, że wojna jest rozpakowana (IMHO, Weblogic nie wyodrębni plików z .war do dysk). - MRalwasser
To nie zadziała, jeśli masz środowisko dev, test, pre-prod i prod, ponieważ potrzebujesz osobnego .war dla każdego środowiska. Powinieneś być w stanie wdrożyć konfigurację raz, a następnie propagować tę samą wojnę przez środowiska ... - Tom Chamberlain
to wcale NIE jest dobre podejście! - Gewure


Wkładam to WEB-INF ukryje plik XML przed użytkownikami, którzy próbują uzyskać do niego bezpośredni dostęp za pośrednictwem adresu URL, więc tak, powiedziałbym, że go wstawiam WEB-INF.


9
2017-09-18 20:29





Nie zapisałbym go w folderze aplikacji, ponieważ przesłoniłoby to konfigurację nowym wdrożeniem aplikacji.

Proponuję zapoznać się z interfejsem API Preferencji lub napisać coś w folderze użytkowników (użytkownik, który uruchamia Tomcat).


5
2017-09-18 19:57





Odpowiedź na to zależy od tego, jak zamierzasz odczytać i zapisać ten plik konfiguracyjny.

Na przykład struktura Spring daje możliwość użyj plików konfiguracyjnych XML (lub pliki właściwości Java); mogą one być przechowywane w ścieżce klas (np. w katalogu WEB-INF), gdziekolwiek indziej w systemie plików, a nawet w pamięci. Jeśli używałeś do tego Springa, to najłatwiejszym miejscem do przechowywania pliku konfiguracyjnego jest katalog WEB-INF, a następnie użyj Springa ClassPathXmlApplicationContext class, aby uzyskać dostęp do pliku konfiguracyjnego.

Ale wszystko zależy od sposobu, w jaki planujesz uzyskać dostęp do tego pliku.


3
2017-09-18 19:57





Jeśli jest to twoja konfiguracja niestandardowa WEB-INF jest dobrym miejscem na to. Ale niektóre biblioteki mogą wymagać konfiguracji do pobytu w WEB-INF / classes.


1
2017-09-18 19:58