java linux jvm preferences

Java-Configuración del directorio del backingstore de Preferencias



linux jvm (3)

En un sistema Linux, el nodo de preferencia raíz del sistema estará bajo /etc Esto se debe a la historia, y es un estándar que está regulado por Linux Standard Base. Cualquier preferencia que no sea del sistema puede ir en otras ubicaciones, pero es una violación del diseño del sistema operativo que la preferencia del sistema vaya a otra parte.

Las probabilidades son que su definición es ineficaz en un sistema Linux porque no puede comenzar en / etc. Aparentemente, algo en el código de Java se remite a la especificación del sistema operativo sobre su decisión de volver a basar la raíz de preferencia.

Normalmente, dichos archivos están protegidos contra modificaciones al no ser mundial (o incluso la mayoría de los usuarios) escribibles. Esto significa que para que los usuarios tengan acceso a las Preferencias, deben pasar por debajo

Preferences.userRoot()

Que los colocará en directorios ocultos justo fuera de su directorio de inicio (donde tendrán privilegios de modificación).

Si desea que cualquier usuario lea las preferencias de cualquier otro usuario (la descripción suena como lo haría), necesitará un instalador que se ejecute como un usuario suficientemente autorizado (normalmente root) para hacer el directorio requerido en /etc y cambiar sus permisos ser mundialmente escribible.

Por lo general, los archivos en / etc no se pueden escribir en todo el mundo, ya que los usuarios pueden cambiar la configuración del usuario de otra persona y se considera un tipo de violación de la seguridad del entorno esperado del usuario. Por ejemplo, un empleado descuidado (o descontento) podría borrar todas las preferencias de los demás usuarios de un solo golpe.

Necesito crear un almacenamiento persistente en mi aplicación Java para que todos los usuarios puedan acceder a él. Así que estaba estudiando acerca de java.util.prefs.Preferences y el uso de systemRoot() funciona bien para mí en Windows, guardando datos en Register. Pero realmente estoy enfrentando algunos problemas en Linux (Ubuntu). Quiero usar un directorio que otras aplicaciones ya usan: / usr / share /. Por lo tanto, estoy tratando de redirigir el directorio predeterminado de systemRoot a / usr / share en tiempo de ejecución. Aquí está mi código:

System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder"); Preferences pref = Preferences.systemRoot().node("/usr/share/myfolder");

De acuerdo con este sitio , tengo que crear la carpeta .systemPrefs antes de ejecutar esta línea de comando y está implícito que systemRoot() usará.

Cuando ejecuto mi programa, java.util.prefs.FileSystemPreferences syncWorld WARNING Couldn''t flush system prefs: java.util.prefs.BackingStoreException: /etc/.java/.systemPrefs/usr create failed. siguiente ADVERTENCIA: java.util.prefs.FileSystemPreferences syncWorld WARNING Couldn''t flush system prefs: java.util.prefs.BackingStoreException: /etc/.java/.systemPrefs/usr create failed.

Así que supongo que System.setProperty no funciona. ¿Cualquier sugerencia? ¡Gracias por adelantado!


Bimalesh sugirió que en lugar de

System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder") , que dices

System.setProperty("-Djava.util.prefs.systemRoot", "/usr/share/myfolder") .

Pero el nombre de la propiedad que está intentando establecer es java.util.prefs.systemRoot , y no -Djava.util.prefs.systemRoot , por lo que debe hacer

System.setProperty("java.util.prefs.systemRoot", "/usr/share/myfolder");

Si eso no funciona, intente agregar el interruptor "-D" a la línea de comando que inicia su programa. Ahí es donde java -D... debería irse. El comando comenzaría con

java -Djava.util.prefs.systemRoot=/usr/share/myfolder


Este es un problema realmente molesto que se ejecuta en servidores basados ​​en * nix.

Pude resolverlo usando los siguientes argumentos vm:

-Djava.util.prefs.userRoot=/opt/apache-tomcat-7.0.50/uprefs -Djava.util.prefs.systemRoot=/opt/apache-tomcat-7.0.50/sprefs

Sin embargo, una nota importante en la ruta del sistema es crear una subcarpeta dentro de ella llamada .systemPrefs o no funcionará.

Además, no olvide chown -R estos directorios para el usuario que ejecuta la aplicación java (en mi caso fue Tomcat).