在Linux上存储应用程序数据(非特定于用户)的位置

Wil*_*iam 41 java linux

在我的基于OSGi的Java应用程序中,我正在开发一个包,以便为系统的其余部分提供对文件系统的访问.除了提供对用户主目录的访问之外,我还希望提供对非用户特定区域的访问.确切地说,这个区域将用于什么尚未确定,但它不适用于首选项(由不同的包处理),但它可能用于存储可能在运行时更改的数据.

我打算为此目的使用以下目录:

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

在Linux中哪一个是合理的等价物,我如何从我的Java代码中获取它?

Rob*_*ska 62

这取决于您计划存储的数据类型.这个答案是在运行时存储和修改数据的前提下.

与其他人的建议相反,我建议不要使用/usr/share存储空间.从文件系统层次结构标准:

/ usr/share层次结构适用于所有只读体系结构的独立数据文件.

在修改数据时,这违反了/usr子系统的只读性质.

存储应用程序状态数据的看似更好的位置将是/var,或更具体地说/var/lib.这也来自层次标准.您可以创建一个/var/lib/myapp,或者如果您还使用锁文件或日志之类的东西,您可以使用/var/lock/var/log.

深入了解整个标准(与上面相关) - 您可能会找到一个适合您想做的更好的地方.

Steve K一样,我也建议使用Preferences API来获取应用程序首选项数据.

  • 将程序数据写入`/ var`通常需要超级用户权限.如果应用程序以用户身份运行该怎么办? (7认同)
  • @BoppityBop `/var/lib` 用于“变量状态信息”,而不是静态库文件。 (3认同)
  • @MathiasKunter-如果应用程序以特定用户身份运行,则应设置相应的`/ var / ...`目录(例如`/ var / log / my-app /`,`/ var / lib / my- app /`等),以对该用户或其组提供读/写访问权限。另外,如果您实际上是在说人类用户,则可以考虑使用其主目录(例如,“〜/ .my-app / ...”)。 (2认同)
  • 如果应用以 ACTUAL 用户身份运行,则数据应存储在该用户的 $HOME 下。如果是系统用户,则安装(以 root 或类似身份)应授予该用户对其 /var 下的文件和目录的所有权,并将该用户添加到访问其他设备/目录/文件所需的任何组中。 (2认同)

sta*_*lue 37

这取决于.

  • 全局配置 - >/etc/appname

  • 只读,独立于机器架构 - >/usr/share/appname

  • 只读,机器特定 - >/usr/lib/appname

  • 读写 - >/var/lib/appname

不保证完整性,请检查文件系统层次结构标准.

  • 日志文件如何?`/ var / log / appname`也许吗? (2认同)

Ste*_*e K 7

既然您使用的是Java,那么您是否查看过Preferences API

从介绍:

应用程序需要首选项和配置数据以适应不同用户和环境的需求.java.util.prefs包为应用程序提供了一种存储和检索用户和系统首选项和配置数据的方法.数据持久存储在依赖于实现的后备存储中.有两个独立的优先节点树,一个用于用户首选项,另一个用于系统首选项

我让内置的API完成工作.


Pas*_*ent 6

freedesktop.org(以前称为X桌面组)项目已在定义了一些标准,这XDG基本目录规范.

在你的情况下,我看看$XDG_DATA_DIRS:

$XDG_DATA_DIRS定义基于首选项的基本目录集,以搜索除$XDG_DATA_HOME基目录之外的数据文件.目录中$XDG_DATA_DIRS应该用冒号':'分隔.

如果$XDG_DATA_DIRS未设置或为空,/usr/local/share/:/usr/share/则应使用等于的值.

我热烈建议阅读XDG基本目录规范.