覆盖 install4j UnixLauncher WM_CLASS 属性

Override install4j UnixLauncher WM_CLASS property

是否可以在 Linux 环境中覆盖 install4j 设置的 WM_CLASS

目前正在执行

xprop WM_CLASS 

在我使用 install4j 部署的应用程序上总是 returns com-install4j-runtime-launcher-UnixLauncher。 这是创建正确的 .desktop 文件时的问题,我不想将使用 install4j 部署的所有应用程序组合在一起。

我收集 this question 处理类似的问题。但是,答案对我不起作用。提到的 sys.ext.windowClass 编译器变量在我能找到的任何地方都没有记录,据我所知它什么也没做。

在 Linux 上,window 经理群组 windows 并使用 WM_CLASS 属性.

分配正确的图标

可以使用 xprop 检查此 属性:

xprop WM_CLASS

要指定 .desktop 文件应该影响哪个 WM_CLASS,您可以在桌面文件中使用 StartupWMClass 属性:

StartupWMClass=<my-applications-wm-class>

install4j 的问题是所有部署的应用程序都将使用 com-install4j-runtime-launcher-UnixLauncher 为 WM_CLASS。

正如 Ingo Kegel 在他现在对 this question 的编辑回答中提到的,这可以通过在 Java 中明确设置 WM_CLASS window 属性 来规避] 使用以下代码的应用程序:

String wmClass = ...;
Toolkit toolkit = Toolkit.getDefaultToolkit();
Class<?> toolkitClass = toolkit.getClass();

if (Objects.equals("sun.awt.X11.XToolkit", toolkitClass.getName())) {

    Field awtAppClassName = toolkitClass.getDeclaredField("awtAppClassName");
    awtAppClassName.setAccessible(true);
    awtAppClassName.set(null, wmClass);
}

如果您的应用程序启动时有初步对话框(例如用于选择工作区),请务必分别对所有对话框执行此操作。