Le programme d’installation Ubuntu DEB rend toutes les applications Java identiques

J’ai créé un programme d’installation DEB de mon application Java pour les systèmes basés sur Debian. Dans mon package DEB, j’utilise un fichier * .desktop comme celui-ci:

[Desktop Entry] Encoding=UTF-8 Version=${version} Type=Application Terminal=false Exec=java -jar /usr/lib/name-of-my-app/${jar} Name=${name} Icon=/usr/share/icons/hicolor/128x128/apps/name-of-my-app.png 

Tout fonctionne correctement, mes applications s’installent bien et fonctionnent bien. Mais j’ai remarqué une chose très étrange: après la première exécution de mon application sur Ubuntu, tous les autres processus nommés “java” dans tout le système ont maintenant l’icône, j’ai spécifié dans le fichier * .desktop. Est-ce un bug Ubuntu? Est-ce un bug dans mon installateur?

Pour ceux qui recherchent une solution pour leurs applications Java sous Ubuntu et autres Linux. Il semble y avoir 2 façons de le faire, selon la boîte à outils de l’interface utilisateur que vous utilisez.

  1. Pour ceux qui utilisent AWT et / ou Swing (qui à leur tour est basé sur AWT), vous n’avez qu’une solution pour le moment. http://elliotth.blogspot.com/2007/02/fixing-wmclass-for-your-java.html – ce gars a réussi à corriger le WM_CLASS:

     Toolkit xToolkit = Toolkit.getDefaultToolkit(); java.lang.reflect.Field awtAppClassNameField = xToolkit.getClass().getDeclaredField("awtAppClassName"); awtAppClassNameField.setAccessible(true); awtAppClassNameField.set(xToolkit, "MyAppName"); 
  2. Pour ceux qui utilisent SWT, il existe un moyen plus simple et documenté:

     Display.setAppName("MyAppName"); 

Après avoir terminé (1) ou (2), vous pouvez maintenant tester cela en exécutant

 xprop|grep WM_CLASS 

Cela changera votre curseur pour être une croix. Avec le nouveau curseur croisé, cliquez sur la fenêtre de votre application en cours d’exécution et assurez-vous que la sortie est

 WM_CLASS(STRING) = "MyAppName", "MyAppName" 

où “MyAppName” est la chaîne que vous avez passée à AWT / SWT plus tôt.

Si tout se passe bien, ajoutez une ligne au fichier MyAppName.desktop comme suit:

 StartupWMClass=MyAppName