如何防止Java应用程序创建任务栏图标?


16

借助Ubuntu 13.04,不再需要将某些应用程序白名单(因此也将其列入黑名单)以创建任务栏图标。从那时起,Java应用程序的托盘图标和Wine图标被硬编码并始终可见。

尽管有某些ppas,但可以通过回馈systray.whitelist(不过,不适用于14.04)来提供统一的补丁程序,我想知道是否还有其他方法可以隐藏Java应用程序的托盘图标(例如JDownloader)

我知道有一种方法可以通过实现拒绝对sni-qt包的读取访问的apparmor-profiles(例如对于Skype或Spotify)来实现qt应用程序

有没有办法为Java应用程序和/或Wine应用程序实现apparmor配置文件或类似的东西?

谢谢


1
您可以访问它们的图标,并将它们更改为透明且较小的,因此它几乎不占用空间并且是不可见的?

2
好主意,但是没有。16x16的位置似乎是为Java应用程序保留的。通过更改为不可见的1px svg,仍然可以得到一个16x16不透明的图标
wa4557 2014年

1
好吧,那太可惜了
蒂姆(Tim

Answers:


2

对于Java应用程序:

  • 实际上,对于JDownloader案例,这是一个模块化设计。托盘图标是一个可从以下位置禁用的插件:

    JDownloader→附加组件→附加组件管理器→扩展→取消选中JD Light Tray的激活

  • 对于一般的Java应用程序,可以通过编写自定义策略规则来使用Java安全管理器。

    1. 在以下位置创建java.policy文件~/.jdownloader

      grant codeBase "file:/home/user/.jdownloader/-" {
      
      // full access
      //    permission java.security.AllPermission;
      
      // AWTPermission full or only selected elements from it
      //    permission java.awt.AWTPermission "*";
      
          permission java.awt.AWTPermission "accessClipboard";
          permission java.awt.AWTPermission "accessEventQueue";
      //    permission java.awt.AWTPermission "accessSystemTray";
          permission java.awt.AWTPermission "createRobot";
          permission java.awt.AWTPermission "fullScreenExclusive";
          permission java.awt.AWTPermission "listenToAllAWTEvents";
          permission java.awt.AWTPermission "readDisplayPixels";
          permission java.awt.AWTPermission "replaceKeyboardFocusManager";
          permission java.awt.AWTPermission "setAppletStub";
          permission java.awt.AWTPermission "setWindowAlwaysOnTop";
          permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
          permission java.awt.AWTPermission "toolkitModality";
          permission java.awt.AWTPermission "watchMousePointer";
      
      // Added by try and learn
          permission java.io.FilePermission "/-", "read,write,delete";
          permission java.util.PropertyPermission "*", "read,write";
          permission java.util.logging.LoggingPermission "control";
          permission java.lang.RuntimePermission "*";
          permission java.net.NetPermission "*";
          permission java.security.SecurityPermission "*";
          permission javax.net.ssl.SSLPermission "*";
          permission java.net.SocketPermission "*", "connect,resolve";
          permission java.lang.reflect.ReflectPermission "*";
      };
    2. 修改jdownloader启动脚本以使用自定义策略

      sudo nano /usr/bin/jdownloader

      添加:-Djava.security.manager -Djava.security.policy=java.policy至java命令调用:

      exec java ${JAVA_OPTIONS}  -Djava.security.manager -Djava.security.policy=java.policy -jar JDownloader.jar $*

这些是允许我启动jdownloader的最低要求。您可能需要添加更多权限。因为没有deny选择,所以您必须编写所有必需的grant规则。

参考文献:

顺便说一句,尝试通过添加//到行的开头来注释规则之一;这样您就可以看到拒绝权限错误的样子。它告诉您应该添加哪个权限。还要注意,在寻找快速解决方案时,我已经使用了很多-*试图扩展规则(AllPermission无论如何都是默认值),而且我也不想让应用程序入狱。

下面是一个模板,尝试授予所有可能的权限:

grant codeBase "file:/home/user/.jdownloader/-" {

//    permission java.security.AllPermission;

//    permission java.awt.AWTPermission "*";

    permission java.awt.AWTPermission "accessClipboard";
    permission java.awt.AWTPermission "accessEventQueue";
//    permission java.awt.AWTPermission "accessSystemTray";
    permission java.awt.AWTPermission "createRobot";
    permission java.awt.AWTPermission "fullScreenExclusive";
    permission java.awt.AWTPermission "listenToAllAWTEvents";
    permission java.awt.AWTPermission "readDisplayPixels";
    permission java.awt.AWTPermission "replaceKeyboardFocusManager";
    permission java.awt.AWTPermission "setAppletStub";
    permission java.awt.AWTPermission "setWindowAlwaysOnTop";
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
    permission java.awt.AWTPermission "toolkitModality";
    permission java.awt.AWTPermission "watchMousePointer";


    permission javax.sound.sampled.AudioPermission "*";
    permission javax.security.auth.AuthPermission "*";
//    permission javax.security.auth.kerberos.DelegationPermission "";
    permission javax.xml.bind.JAXBPermission "*";
    permission java.nio.file.LinkPermission "hard";
    permission java.nio.file.LinkPermission "symbolic";
    permission java.util.logging.LoggingPermission "control";
//    permission java.lang.management.ManagementPermission "*";
    permission javax.management.MBeanServerPermission "*";
    permission javax.management.MBeanTrustPermission "*";
    permission java.net.NetPermission "*";
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.reflect.ReflectPermission "*";
    permission java.lang.RuntimePermission "*";
    permission java.security.SecurityPermission "*";
    permission java.io.SerializablePermission "*";
    permission java.sql.SQLPermission "*";
    permission javax.net.ssl.SSLPermission "*";
    permission javax.management.remote.SubjectDelegationPermission "*";
    permission javax.xml.ws.WebServicePermission "*";
//    permission  "*";

    permission java.io.FilePermission "/-", "read,write,execute,delete,readlink";
    permission javax.management.MBeanPermission "*", "*";
//    permission javax.security.auth.PrivateCredentialPermission "", "read";
    permission javax.security.auth.kerberos.ServicePermission "*", "initiate,accept";
    permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
    permission java.net.URLPermission "*";
};

注意事项

Java Policy Tools是用于编辑策略文件的GUI工具。它使从下拉框中找出所有可用选项更加容易。它应该已经与Java软件包一起安装。

在此处输入图片说明


1

尽管Sneetshers的答案很完美,但我发现了一个更简单(也很明显)的解决方案。这种方法适用于JDownloader,但也应适用于所有其他Java程序。

只需删除徽标rm ~/.jdownloader/jd/img/logo/jd_logo_128_128.png,然后使用以下命令创建一个无效的png图标touch ~/.jdownloader/jd/img/logo/jd_logo_128_128.png

使用这种方法,仍然可以使用TrayIcon插件(用于最小化托盘),而无需使用丑陋的Java图标


0

我认为没有明显更好的解决方案,这可能会有所帮助:

您可以一起摆脱托盘!

  • 如果可能的话,要么禁用它
  • 或将整个面板替换为您可以手动配置的其他面板,而无需添加托盘元素。(我喜欢xfce4-panel这种东西)

如果您现在想错过基于托盘的功能,那么大多数情况都应视具体情况而定,例如在某些事件中显示桌面通知的脚本。


1
好的,谢谢,但这显然不是我想要的。我喜欢统一托盘,只是不喜欢某些托盘图标
wa4557

1
是的,就了解您的基本用例而言,这更多的是黑暗中的一击。对于“设备”风格的计算机,运行一个固定的应用程序,再加上仅用于基本菜单的桌面栏。该方法甚至可以工作:) [但是我记得我曾经看到过一些程序拒绝不使用面板启动的消息...]
Volker Siegel 2014年

0

如果希望所有使用任务栏图标的应用程序都能在Ubuntu 14.04中使用它,则可以使用Unity附带的PPA修补程序来重新启用系统托盘白名单。为此,请打开终端并运行以下命令:

sudo add-apt-repository ppa:gurqn/systray-trusty
sudo apt-get update
sudo apt-get upgrade

然后,通过按ALT + F2并输入“ unity”或注销来重新启动Unity。PPA现在会自动将所有应用程序列入白名单,因此无需手动将单个应用程序列入白名单即可使用系统托盘。

还原更改

如果要还原更改并从Ubuntu存储库返回默认的Unity软件包,请使用以下命令清除Unity systray白名单PPA:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:gurqn/systray-trusty

来自http://www.webupd8.org/2013/05/how-to-get-systray-whitelist-back-in.html


1
欢迎使用Ask Ubuntu Stak Exchange!请在您的答案中包含链接的重要部分,以防止链接死亡后中断发布。
埃德尼尔2014年

2
这是全局白名单,这意味着所有程序都被列入白名单。将清单列入黑名单的程序(例如wine和Java程序)完全相反,也不适用于此版本的统一性
wa4557
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.