Dove archiviare i dati dell’applicazione (non specifici dell’utente) su Linux

Nella mia app Java basata su OSGi sto sviluppando un pacchetto per fornire al resto del sistema l’accesso al file system. Oltre a fornire l’accesso alla home directory dell’utente, desidero anche fornire l’accesso a un’area non specifica dell’utente. Esattamente ciò per cui questa area verrà utilizzata non è ancora definita, ma non sarà per le preferenze (gestita da un bundle diverso), tuttavia potrebbe essere utilizzata per memorizzare i dati che potrebbero cambiare in fase di esecuzione.

Intendo utilizzare le seguenti directory per questo scopo:

  • Windows Vista e Windows 7: “\ ProgramData”.
  • Windows XP: “\ Documents and Settings \ All Users”.
  • Mac OS X: “/ Library / Application Support”.

Dov’è un equivalente ragionevole in Linux e come ottenerne una maniglia dal mio codice Java?

Dipende dal tipo di dati che stai pianificando di archiviare. Questa risposta è sotto la premessa che stai memorizzando e modificando i dati in fase di runtime.

Contrariamente a quanto suggerito da altri, consiglierei di non utilizzare /usr/share per l’archiviazione. Dallo standard della gerarchia del filesystem :

La gerarchia / usr / share è per tutti i file di dati indipendenti dall’architettura di sola lettura.

Mentre modifichi i dati, questo va contro la natura di sola lettura del sottosistema /usr .

Un posto apparentemente migliore per memorizzare i dati dello stato dell’applicazione sarebbe /var , o più specificamente, /var/lib . Anche questo deriva dallo standard della gerarchia . Potresti creare un /var/lib/myapp , o se stai anche usando cose come lock file o log, potresti usare /var/lock o /var/log .

Dai un’occhiata più approfondita allo standard nel suo insieme (collegato a quello sopra): potresti trovare un posto che si adatta meglio a quello che vuoi fare.

Come Steve K , raccomanderei anche l’utilizzo dell’API Preferenze per i dati delle preferenze dell’applicazione.

Dipende.

  • Configurazione globale -> / etc / appname

  • Sola lettura, indipendente dall’architettura della macchina -> / usr / share / appname

  • Sola lettura, specifica della macchina -> / usr / lib / appname

  • Leggi-scrivi -> / var / lib / appname

Nessuna garanzia di completezza, si prega di controllare lo standard della gerarchia del filesystem .

Dal momento che stai usando Java, hai guardato l’ API delle preferenze ?

Dall’introduzione:

Le applicazioni richiedono preferenze e dati di configurazione per adattarsi alle esigenze di diversi utenti e ambienti. Il pacchetto java.util.prefs fornisce un modo per le applicazioni di archiviare e recuperare le preferenze utente e di sistema e i dati di configurazione. I dati vengono archiviati in modo persistente in un backing store dipendente dall’implementazione. Esistono due alberi separati di nodes di preferenza, uno per le preferenze dell’utente e uno per le preferenze di sistema

Mi piacerebbe che l’API integrata facesse il lavoro.

Il progetto freedesktop.org (precedentemente noto come il gruppo X Desktop) ha definito alcuni standard per questo nella specifica della directory di base XDG .

Nel tuo caso, $XDG_DATA_DIRS un’occhiata a $XDG_DATA_DIRS :

$XDG_DATA_DIRS definisce il set ordinato di preferenza delle directory di base per cercare i file di dati oltre alla directory di base $XDG_DATA_HOME . Le directory in $XDG_DATA_DIRS devono essere $XDG_DATA_DIRS da due punti ‘:’.

Se $XDG_DATA_DIRS non è impostato o vuoto, dovrebbe essere usato un valore uguale a /usr/local/share/:/usr/share/ .

Suggerisco caldamente di leggere la specifica della directory di base XDG .

Nelle cartelle / usr / share o / usr / local / share

Se non è specifico per utente, puoi probabilmente archiviarlo in / usr / share / appname

So che questa è una vecchia domanda, ma secondo https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard (che sembra essere aggiornata e corretta a partire da luglio 2015) …

Supponendo che i file di dati non soddisfino i requisiti di /tmp o /var/tmp allora /usr/local/share/theApp o /usr/local/theApp .

Vuoi hard-code in questo modo. È ansible utilizzare System.getProperty (“user.home”) per riportare gli utenti a casa in modo che siano più indipendenti dalla piattaforma.