Где хранить данные приложения (не для пользователя) в Linux - PullRequest
37 голосов
/ 02 октября 2009

В моем Java-приложении на основе OSGi я разрабатываю пакет, чтобы предоставить остальной части системы доступ к файловой системе. В дополнение к предоставлению доступа к домашнему каталогу пользователя, я также хочу предоставить доступ к области, не относящейся к пользователю. То, для чего будет использоваться эта область, пока не определено, но это не будет сделано для предпочтений (обработанных другим пакетом), однако она может использоваться для хранения данных, которые могут измениться во время выполнения.

Я намерен использовать для этой цели следующие каталоги:

  • Windows Vista и Windows 7: «\ ProgramData».
  • Windows XP: «\ Documents and Settings \ All Users».
  • Mac OS X: «/ Библиотека / Поддержка приложений».

Где разумный эквивалент в Linux и как мне получить его из моего кода Java?

Ответы [ 8 ]

59 голосов
/ 02 октября 2009

Это зависит от того, какие данные вы планируете хранить. Этот ответ подразумевает, что вы храните и изменяете данные во время выполнения.

Вопреки тому, что другие предложили, я бы рекомендовал не использовать /usr/share для хранения. Из стандарта иерархии файловой системы :

Иерархия / usr / share предназначена для всех независимая только для чтения архитектура файлы данных.

Когда вы изменяете данные, это противоречит принципу «1012 *», предназначенному только для чтения.

Казалось бы, лучшее место для хранения данных о состоянии вашего приложения было бы /var или, точнее, /var/lib. Это также происходит из стандарта иерархии . Вы можете создать /var/lib/myapp, или если вы также используете такие вещи, как блокировка файлов или журналов, вы можете использовать /var/lock или /var/log.

Более подробно посмотрите на стандарт в целом (ссылка на него выше) - вы можете найти место, которое соответствует тому, что вы хотите сделать еще лучше.

Как и Стив К , я бы также рекомендовал использовать API настроек для данных о настройках приложения.

36 голосов
/ 02 октября 2009

Это зависит.

  • Глобальная конфигурация -> / etc / appname

  • Только для чтения, независимо от архитектуры машины -> / usr / share / appname

  • Только для чтения, зависит от компьютера -> / usr / lib / appname

  • Чтение-запись -> / var / lib / appname

Нет гарантии полноты, пожалуйста, проверьте Стандарт иерархии файловой системы .

7 голосов
/ 02 октября 2009

Поскольку вы используете Java, рассматривали ли вы Preferences API ?

Из введения:

Приложениям требуются данные о предпочтениях и конфигурации для адаптации к потребностям различных пользователей и сред. Пакет java.util.prefs позволяет приложениям хранить и извлекать данные о пользовательских и системных настройках и конфигурации. Данные постоянно хранятся в зависимом от реализации резервном хранилище. Существует два отдельных дерева узлов предпочтений, одно для пользовательских настроек, другое для системных предпочтений

Я бы позволил встроенному API сделать работу.

5 голосов
/ 02 октября 2009

Проект freedesktop.org (ранее известный как X Desktop Group) определил некоторые стандарты для этого в Базовая директория XDG .

В вашем случае я бы посмотрел на $XDG_DATA_DIRS:

$XDG_DATA_DIRS определяет упорядоченный по предпочтениям набор базовых каталогов для поиска файлов данных в дополнение к базовому каталогу $XDG_DATA_HOME. Каталоги в $XDG_DATA_DIRS должны быть разделены двоеточием ':'.

Если $XDG_DATA_DIRS либо не установлен, либо пуст, следует использовать значение, равное /usr/local/share/:/usr/share/.

Я настоятельно рекомендую прочитать Спецификацию XDG Base Directory .

3 голосов
/ 02 октября 2009

В / usr / share или / usr / local / share папках

1 голос
/ 09 декабря 2015

Я знаю, что это старый вопрос, но согласно https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard (который, кажется, обновлен и исправлен по состоянию на июль 2015 года) ...

Предполагается, что файлы данных не соответствуют требованиям /tmp или /var/tmp, а затем /usr/local/share/theApp или /usr/local/theApp.

1 голос
/ 02 октября 2009

Если это не зависит от пользователя, вы, вероятно, можете сохранить его в / usr / share / appname

0 голосов
/ 02 октября 2009

Вы хотите жестко закодировать это так? Вы можете использовать System.getProperty ("user.home"), чтобы вернуть пользователей домой, чтобы они были более независимыми от платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...