gpt4 book ai didi

Linux 中的 Java - root 用户和非 root 用户的不同外观类

转载 作者:IT王子 更新时间:2023-10-29 00:40:33 25 4
gpt4 key购买 nike

我注意到 Java 为根用户和非根用户提供了不同的外观类。我试图了解如何使 LAF 保持一致。此外,它甚至在用户/root 内部也不一致:取决于用户/root 的登录方式:

示例代码(编译打包在laf.jar中):

import javax.swing.UIManager;

public class laf {
public static void main(java.lang.String[] args) {
try {
System.out.print(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
}
}

场景 1以普通用户身份登录机器(在 GUI 模式下)

示例输出(作为用户)

[xxx@yyy Downloads]$ java -classpath laf.jar laf
com.sun.java.swing.plaf.gtk.GTKLookAndFeel

示例输出(通过 su 切换到 root)

[root@yyy Downloads]# java -classpath ./laf.jar laf
javax.swing.plaf.metal.MetalLookAndFeel

场景 2 以 root 身份登录机器(在 GUI 模式下)

示例输出(作为root)

[root@yyy Downloads]# java -classpath ./laf.jar laf
com.sun.java.swing.plaf.gtk.GTKLookAndFeel

场景 3 以普通用户身份通过​​ SSH 登录计算机(与上面的场景 #1 类似,但在本例中 - 相同的 LAF)

示例输出(作为用户)

[xxx@yyy Downloads]$ java -classpath laf.jar laf
javax.swing.plaf.metal.MetalLookAndFeel

示例输出(切换到root)

[root@yyy Downloads]# java -classpath ./laf.jar laf
javax.swing.plaf.metal.MetalLookAndFeel

软件版本:

[root@yyy Downloads]# java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build pxa6470sr9fp10-20150708_01(SR9 FP10))
IBM J9 VM (build 2.6, JRE 1.7.0 Linux amd64-64 Compressed References 20150701_255667 (JIT enabled, AOT enabled)
J9VM - R26_Java726_SR9_20150701_0050_B255667
JIT - tr.r11_20150626_95120.01
GC - R26_Java726_SR9_20150701_0050_B255667_CMPRSS
J9CL - 20150701_255667)
JCL - 20150628_01 based on Oracle jdk7u85-b15

[root@yyy Downloads]# cat /etc/redhat-release
Red Hat Enterprise Linux Workstation release 6.7 (Santiago)

最佳答案

这不是关于 root,更多是关于环境变量。

基本上,UIManager.getSystemLookAndFeelClassName方法是这样的:

  • 检查 swing.systemlaf 系统属性。这允许用户覆盖系统想要选择的任何内容。如果它不为空,则使用它。
  • 否则,如果操作系统是 Windows,则返回 WindowsLookAndFeel
  • 否则,它会检查 sun.desktop 属性。如果 sun.desktop 设置为 gnome,并且 GTK 是本地可用的,它会返回 GTKLookAndFeel
  • 否则,检查 Mac OS X 和 Solaris 并为这些操作系统返回适当的值。
  • 如果所有其他检查均失败,则返回“跨平台”L&F,即 MetalLookAndFeel

因此,与 Linux/Unix 相关的部分是检查 sun.desktop 的部分。该属性在 JVM 启动时设置。如果环境变量 GNOME_DESKTOP_SESSION_ID 存在,则设置为 gnome,忽略其内容,否则设置为 null。我相信this is the pertinent native source code就是这样做的。

因此,在 Linux 上,如果设置了该环境变量(并且 GTK 可用),您的 L&F 将设置为 GTKLookAndFeel。如果不是,它将被设置为 MetalLookAndFeel

当您使用桌面管理器登录到基于 Gnome 的 Linux 时,您的环境将设置该变量。但默认情况下,su 命令不会传播环境变量。因此,当您对任何用户(不一定是 root)执行 su 时,您将丢失 GNOME_DESKTOP_SESSION_ID 环境变量,并且 Java 将默认为 MetalLookAndFeel

您可以使用 su -p 使您的环境通过 su 传递,或者如果您正在使用 sudo,请使用 sudo -E.

ssh 命令,如 susudo,不会传播环境变量。这也可以使用 ~/.ssh/environment 解决。

但是,如前所述 - 您可以通过将 -Dswing.systemlaf=... 切换到 java 命令来轻松强制执行特定的 L&F。

关于Linux 中的 Java - root 用户和非 root 用户的不同外观类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com