2010-07-01 28 views
18

La mia applicazione Web Java (myapp.war) è distribuita inserendola nella direcotry webapps su Tomcat su Ubuntu 10.04.Dove deve essere memorizzata una sua applicazione Web Java?

Questa applicazione deve salvare alcuni dati nei file. Tuttavia, l'utente, che esegue Tomcat (tomcat6), non ha accesso in scrittura alla directory principale /usr/share/tomcat6/ e non ha accesso in scrittura alla directory di lavoro corrente /var/lib/tomcat6/, poiché entrambi appartengono allo root.

Quindi, dov'è necessario che un'applicazione Web memorizzi i propri dati? Spero che non sia l'archivio estratto nella directory webapps. Questo potrebbe essere cancellato molto facilmente per caso. E Tomcat può essere configurato, non per estrarre i file .war. Quindi non ci sarebbe la direcotry estratto.

Forse /var/lib/tomcat6/ dovrebbe appartenere all'utente tomcat6 ant questo è un bug in Ubuntu?

+0

Non esiste alcuna garanzia che un contenitore Web consenta di utilizzare il file system ... –

+0

Stai cercando di leggere i dati o di scriverlo? Normalmente le app Web non utilizzano il file system per il salvataggio dei dati, utilizzano un DB, un servizio Web o una coda JMS per comunicare rispettivamente a un altro sistema in modo asincrono o asincrono. –

+0

Ho bisogno di leggere e scrivere dati. Ho il mio framework di archiviazione, che funziona molto meglio di qualsiasi database per me. – Witek

risposta

2

Ho trovato la soluzione su Launchpad. /var/lib/tomcat6/webapps/ è scrivibile. Ciò significa che le seguenti opere:

File myFile = new File("webapps/myfile.txt"); 
+1

Ok, ma probabilmente non è una soluzione portatile (funziona con Tomcat, ma potrebbe non funzionare se si esegue la propria webapp su un altro app server Java EE). – Jesper

+0

E non funzionerà se si modifica la directory di lavoro (la cartella da cui è stato emesso il comando per avviare Tomcat). L'utilizzo di percorsi relativi nell'IO di Java è una pessima idea. Piuttosto, usa i percorsi assoluti nell'IO di Java come '/ var/lib/tomcat6/webapps/myfile.txt'. – BalusC

+0

I percorsi assoluti mi legherebbero a Tomcat su Linux. Vorrei offrire un file .war che deve essere semplicemente scaricato nella directory webapps su quasi tutte le piattaforme possibili. – Witek

0

Non ho visto alcuna guida specifica su dove archiviare questo tipo di dati localmente - probabilmente perché normalmente si memorizzerebbe quel tipo di dati in un database.

Quando ho bisogno di memorizzare dati veloci e sporchi del genere, lo memorizzo su un file system appositamente per quei dati, per isolarlo da altre aree in cui potrebbe rimanere intrappolato in altre attività. Non ho avuto problemi con l'approccio finora. Inoltre, se è importante, assicurati di conservarlo da qualche parte dove lo stai eseguendo :) :)

+1

Anche se memorizzassi i dati in un database, dovrei memorizzare i dati di accesso per il database da qualche parte. – Witek

+0

Cosa intendi per "access-data"? – Dolph

+2

@Witek, Tomcat può fornire origini dati JDBC preconfigurate tramite JNDI. La configurazione per quelli va nei soliti file di configurazione di Tomcat. –

2

Penso che dipenda dal tipo di dati che stai trattando. Il più delle volte, i dati vengono inseriti nel database semplicemente perché è veloce e facile eseguire un CRUD. Se vuoi archiviare la configurazione utente localizzata e non ti importa quanto sia portatile, forse puoi memorizzare sotto user.home, l'ho fatto per uno dei miei progetti e funziona perfettamente. Detto questo, non credo che ci sia alcuna pratica migliore su questo e il database sembra essere la scelta più ovvia perché si possono fare molti compiti diversi contro di esso, e la maggior parte di essi sono liberi di cominciare. :)

+0

user.home non funziona. Su Ubuntu appartiene a root. – Witek

4

Se i file non devono persistono più lungo del ciclo di vita del contesto servlet, il contenitore di servlet fornisce una directory temporanea privato per ogni contesto servlet, specificato per attributo javax.servlet.context.tempdir.

Vedi Servlet Specification 2.3, capitolo 3 Servlet Context

3.7.1 temporanei directory

La comodità di una directory archiviazione temporanea è necessaria per ogni contesto servlet. I contenitori servlet devono fornire una directory temporanea privata per servlet e renderla disponibile tramite l'attributo javax.servlet.context.tempdircontext . L'oggetto associato l'attributo deve essere di tipo java.io.File

2

Rispondendo alla sua stessa domanda, ha dichiarato Witek /var/lib/tomcat6/webapps/ is writable - almeno sulla sua installazione della sua versione di Ubuntu. Sulla mia RHEL 5.Il sistema 2 /var/lib/tomcat<X> non esiste nemmeno, quindi non esiste una sottodirectory webapp scrivibile o meno, il che porta alla mia risposta.

Q: Dove deve essere memorizzata un'applicazione Web Java?
A: Ovunque lo si sia configurato per archiviare i propri dati.

Rendere configurabile la posizione, in web.xml come <context-param> o in un file myApplication.properties.

  • Posso metterlo dove voglio sulla mia scatola, gli amministratori di sistema possono metterlo dove vogliono sul sistema di produzione.
  • Puoi cambiare idea in seguito.
  • non hai bisogno di collegamenti simbolici (che hanno magicamente scomparsi su di me prima, rompendo il sistema.)
  • Si possono avere diversi insiemi di dati di test, e basta puntare la configurazione a seconda di quale quello che si desidera.
  • Puoi metterlo ovunque ci sia spazio su disco.
  • cambierà idea in seguito.
+2

La configurazione in web.xml causerebbe grossi problemi durante l'aggiornamento. Ogni nuovo .war consegnato dagli sviluppatori sovrascriverebbe la configurazione degli amministratori. – Witek

+1

La lettura di un file personalizzato myApplication.properties solleva il problema, dobbiamo cercare il file. – Witek

Problemi correlati