2009-10-02 2 views
30

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

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

  • Windows Vista & Windows 7: «\ ProgramData».
  • Windows XP: «\ Documents and Settings \ All Users».
  • Mac OS X: "/ Library/Application Support".

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

+0

Можете ли вы уточнить, какой тип данных вы храните? Это статические данные (файлы конфигурации, статическая информация и т. Д.), Или это данные, которые были изменены во время выполнения? Я ответил ниже, исходя из предположения о последнем, но после повторного чтения вашего вопроса я не совсем уверен, что вы после. –

+0

Я переформулировал вопрос (надеюсь), прояснить ситуацию несколько. – William

+0

Аналогичный вопрос - https://unix.stackexchange.com/questions/70700/whats-the-most-appro-directory-where-to-place-files-shared-between -users. –

ответ

48

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

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

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

Поскольку вы изменяете данные, это противоречит принципу подписи /usr только для чтения.

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

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

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

+1

Для записи данных программы в '/ var' обычно требуются привилегии суперпользователя. Что делать, если приложение работает как пользователь? – emkey08

+0

@MathiasKunter. Если приложение работает как конкретный пользователь, вы должны настроить соответствующие каталоги '/ var/...' (например, '/ var/log/my-app /', '/ var/lib/my -app/'и т. д.), чтобы предоставить доступ для чтения/записи этому пользователю или его группе. В качестве альтернативы, если это фактический пользователь, о котором вы говорите, вы можете подумать об использовании своего домашнего каталога (например, '~/.my-app/...'). –

+0

Если приложение работает как пользователь ACTUAL, данные должны храниться под этими пользователями $ HOME. Если это системный пользователь, установка (как root или аналогичная) должна предоставить владельцу права на его файлы и каталоги в/var и добавить пользователя в группы, необходимые для доступа к дополнительным устройствам/каталогам/файлам. –

1

Если это не пользователь конкретно, вероятно, можно сохранить его в/USR/доли/имя_приложения

-1

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

+0

Я буду использовать это, когда мне нужен доступ к дому пользователя, однако мой вопрос связан с областью, не связанной с пользователем (которую можно получить с помощью System.getenv («ALLUSERSPROFILE») в Windows, но это не работает Linux). – William

+0

Ах, извините. Я неправильно понял, что вы были после. Свойства, как было предложено ранее, поддерживают всех пользователей. Я знаю, что в Windows он хранит его в реестре, не уверен, где он хранит информацию о Linux. –

7

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

Из введения:

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

Я бы разрешил встроенный API выполнить эту работу.

+0

Спасибо. Мы также будем внедрять службу настроек (OSGi), однако также нужен доступ к файловой системе для других целей. – William

+0

Реализация Linux в настройках Linux использует файловую систему. Не уверен, почему это не соответствует вашим потребностям - можете ли вы расширить его больше? Вы также можете создать свой собственный резервный магазин для своих предпочтений - если вы хотите принять то, что далеко. –

29

От этого зависит.

  • Глобальная конфигурация ->/и т.д./имя_приложения

  • только для чтения, независимо от архитектуры машины ->/USR/доли/имя_приложения

  • только для чтения, специфическими для машины ->/USR/Lib/имя_приложения

  • чтения-записи ->/вар/Библиотека/имя_приложения

Нет гарантии на комплектность, пожалуйста, проверьте Filesystem Hierarchy Standard.

+1

Как насчет файлов журналов? '/ var/log/appname' может быть? –

4

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

В вашем случае, я бы взглянуть на $XDG_DATA_DIRS:

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

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

Предлагаю прочитать XDG Base Directory Specification.

1

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

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

Смежные вопросы