Care este cel mai bun loc pentru a stoca un fișier de configurare într-o aplicație web Java (WAR)?

Creez o aplicație web (WAR) și o implementez pe Tomcat. În webapp există o pagină cu un formular în care un administrator poate introduce anumite date de configurare. Nu vreau să stochez aceste date într-un DBMS, ci doar într-un fișier xml din sistemul de fișiere. Unde să-l punem?

Aș dori să pun fișierul undeva în arborele de directoare unde este implementată aplicația în sine. Ar trebui să fi fișierul meu de configurare în directorul WEB-INF ? Sau puneți-o în altă parte?

Și care este codul Java de folosit într-un servlet pentru a găsi calea absolută a directorului? Sau poate fi accesat cu o cale relativă?

0
Rețineți că nu există un mecanism implicit pentru motoarele de servlet - va trebui să faceți ipoteze specifice vânzătorului.
adăugat autor Thorbjørn Ravn Andersen, sursa

6 răspunsuri

Dacă este config personalizat WEB-INF este un loc bun pentru el. Dar unele biblioteci pot solicita config-uri să locuiască în WEB-INF/clase.

0
adăugat

Introducerea lui în WEB-INF va ascunde fișierul xml de utilizatorii care încearcă să-l acceseze direct printr-o adresă URL, așa că da, aș spune, puneți-l în WEB-INF .

0
adăugat

Nu l-aș stoca în dosarul aplicației, pentru că aceasta ar suprascrie configurația cu o nouă implementare a aplicației.

Vă sugerez să aruncați o privire la API-ul Preferințe sau să scrieți ceva în dosarul utilizatorilor (utilizatorul care execută Tomcat).

0
adăugat

Răspunsul la acest lucru depinde de modul în care intenționați să citiți și să scrieți acest fișier de configurare.

De exemplu, cadrul de primăvară vă oferă posibilitatea de a utilizați fișiere de configurare xml (sau fișiere de proprietăți Java); acestea pot fi stocate în calea dvs. de clasă (de ex., în directorul WEB-INF), oriunde altundeva în sistemul de fișiere sau chiar în memorie. Dacă ați folosi Spring pentru acest lucru, atunci cel mai ușor loc pentru a stoca fișierul config este în directorul WEB-INF și apoi utilizați pentru a accesa fișierul de configurare.

Dar din nou, totul depinde de cum intenționați să accesați fișierul.

Ceea ce facem este să îl plasăm într-un director separat pe server (puteți folosi ceva ca/​​config,/opt/config,/root/config,/home/username/config sau orice doriți). Atunci când servletul nostru pornește, citiți fișierul XML, obțineți câteva lucruri din el (cel mai important, informații despre conexiunea DB) și asta este.

Am întrebat de ce am făcut asta odată.

Ar fi frumos să stocați totul în DB, dar, evident, nu puteți stoca informații despre conexiunea DB în DB.

Ai putea codifica lucrurile în cod, dar e urât din mai multe motive. Dacă informațiile trebuie să se schimbe vreodată, trebuie să reconstruiți codul și să îl redistribuiți. Dacă cineva primește o copie a codului sau a fișierului WAR, aceștia ar primi aceste informații.

Punerea lucrurilor în fișierul WAR pare frumos, dar dacă vrei să schimbi lucrurile mult ar putea fi o idee rea. Problema este că, dacă trebuie să schimbați informațiile, data viitoare când o veți redistribui, va suprascrie fișierul astfel încât tot ce nu vă amintiți să schimbați în versiunea integrată în WAR este uitată.

Fișierul într-un loc special pe sistemul de fișiere funcționează destul de bine pentru noi. Nu are nici un dezavantaj mare. Știți unde este, este stocat separat, face ușor deplasarea la mai multe mașini dacă toate au nevoie de diferite valori config (deoarece acestea nu fac parte din WAR).

Singura altă soluție pe care o pot gândi că ar funcționa bine ar fi păstrarea totul în DB, cu excepția datelor de conectare DB. Acest lucru ar proveni din proprietățile sistemului Java care sunt preluate prin JVM. Acest lucru este preferat de API-ul preferințelor menționat de Hans Doggen de mai sus. Nu cred că a fost în jurul valorii de atunci când cererea noastră a fost dezvoltat pentru prima dată, dacă nu a fost folosit.

În ceea ce privește calea de accesare a fișierului de configurare, este doar un fișier în sistemul de fișiere. Nu trebuie să vă faceți griji cu privire la calea web. Deci, atunci când servletul dvs. pornește, acesta deschide fișierul la "/config/myapp/config.xml" (sau altceva) și va găsi ceea ce trebuie. Doar codul hardcode pentru această cale pare destul de inofensiv pentru mine.

0
adăugat
Specificăm o proprietate a sistemului când pornește Tomcat. Aplicația noastră primește directorul config din această proprietate a sistemului, astfel încât să putem folosi un director de configurare diferit de la server la server.
adăugat autor ScArcher2, sursa
Cum ar funcționa acest lucru dacă aveți mai multe medii (de exemplu, test și staționare) care rulează în același tomcat? Deoarece nu puteți specifica o proprietate a sistemului pe mediu atunci când aveți doar un tomcat.
adăugat autor AtliB, sursa
Vă mulțumim pentru sugestiile dvs. Sunt foarte utile pentru mine.
adăugat autor boes, sursa
Mai degrabă decât să citezi calea completă la fișier, poți să pui directorul "config" pe calea de clasă pentru server și să folosești doar ClassLoader.getResource ().
adăugat autor John Meagher, sursa
Acest lucru funcționează și pentru noi, dar poate fi o durere dacă vă instalați ocazional pe Windows, unde nu este natural să adăugați/optați și așa.
adăugat autor Peter Hilton, sursa
doar o mică observație: în conformitate cu ghidul ierarhiei sistemului de fișiere tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html , toate fișierele ar trebui să meargă sub/opt/'package'/config unde 'package' este numele programului tău.
adăugat autor milan, sursa
@Peter: Setarea mea de configurare a fost pe Windows. Tocmai am creat directorul de pe cutia mea de pe C, astfel încât, atunci când cererea a cerut "/ config", ar obține directorul corect. A funcționat destul de bine.
adăugat autor MBCook, sursa
@ John: Asta este de fapt o idee destul de bună, asta a fost pur și simplu când am ajuns acolo.
adăugat autor MBCook, sursa
În aplicația pe care am lucrat în prezent, stocăm fișierul de configurare în afara aplicației într-un director din directorul USER_HOME. La pornire, aplicația primește fișierul din locația String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml";
adăugat autor Nikola, sursa
@MBCook Vă mulțumim pentru comentariul dvs. Mi-a înlăturat îndoielile.
adăugat autor Vimal Panchal, sursa

WEB-INF este un loc bun pentru a pune fișierul de configurare. Iată câteva coduri pentru a obține calea absolută a directorului dintr-un servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
0
adăugat
Aceasta nu este o abordare compatibilă - nu este garantată de speculația servlet că getRealPath() va returna o cale validă (non-null) sau chiar că războiul este despachetat deloc (IMO, Weblogic nu va extrage fișiere din. disc).
adăugat autor MRalwasser, sursa
aceasta nu este o abordare bună la toate!
adăugat autor Gewure, sursa
Acest lucru nu va funcționa dacă aveți un mediu de dezvoltare, test, pre-prod și prod, deoarece veți avea nevoie de un individ .war pentru fiecare mediu. Ar trebui să puteți implementa o dată configurația și apoi să propagați același război prin medii ...
adăugat autor Tom Chamberlain, sursa
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com