我刚刚开始使用 jpackage,它是一个非常棒的工具。只要迈出一步,我的肩上的工作就减轻了很多。我对看起来硬编码且无法定制的东西越感到惊讶?
JPackage 自动生成启动器(lib/<application>.desktop
文件),deb 包会自动安装它,以便所有用户都可以启动该应用程序。但一启动,统一又弹出另一个图标。我期望现有图标被标记为正在运行。
根据Ubuntu DEB 安装程序使所有 Java 应用程序具有相同的图标 https://stackoverflow.com/questions/18941454/ubuntu-deb-installer-makes-all-java-applications-have-the-same-icon我们只需要确保 .desktop 文件包含正确的StartupWMClass
。使用 xprop 我发现这个值是基于负责窗口的完全限定类名 - 这绝对有意义。
那么我如何告诉 jpackage 在生成的 .desktop 文件中设置哪个 StartupWMClass 呢?
编辑:为了补充 Bodo 的评论,我将展示如何调用 jpackage。事实上,我自己没有运行命令行 - 相反,我使用配置为以下的 Maven 插件:
<plugin>
<groupId>com.github.akman</groupId>
<artifactId>jpackage-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jpackage</goal>
</goals>
<configuration>
<dest>target</dest>
<name>OoliteCommunicator</name>
<type>PLATFORM</type>
<appversion>${project.version}</appversion>
<description>Oolite Communicator is an add-on for Oolite to allow multiplayer interaction. (check http://oolite.org)</description>
<vendor>Hiran</vendor>
<icon>target/classes/com/mycompany/oolitecommunicator/ui/Communicator_Logo_Icon.png</icon>
<input>target/dist</input>
<mainjar>OoliteCommunicator-${project.version}.jar</mainjar>
<mainclass>com.mycompany.oolitecommunicator.Main</mainclass>
</configuration>
</execution>
</executions>
</plugin>
我在 Maven 构建过程中看到的是这个输出,我相信这是插件调用 jpackage 时内部生成的命令行。最后一行可能已经是调用了,每当我在构建后检查时,都没有文件 /home/hiran/NetBeansProjects/OoliteCommunicator/target/jpackage.opts。我只能假设它的内容是之前记录的。
# jpackage
--dest /home/hiran/NetBeansProjects/OoliteCommunicator/target
--app-version '1.0-20211220-090022'
--description 'Oolite Communicator is an add-on for Oolite to allow multiplayer interaction. (check http://oolite.org)'
--name 'OoliteCommunicator'
--vendor 'Hiran'
--icon /home/hiran/NetBeansProjects/OoliteCommunicator/target/classes/com/mycompany/oolitecommunicator/ui/Communicator_Logo_Icon.png
--input /home/hiran/NetBeansProjects/OoliteCommunicator/target/dist
--main-jar 'OoliteCommunicator-1.0-20211220-090022.jar'
--main-class com.mycompany.oolitecommunicator.Main
/usr/lib/jvm/java-16-openjdk-amd64/bin/jpackage @/home/hiran/NetBeansProjects/OoliteCommunicator/target/jpackage.opts
最后我得到了一个带有这个桌面文件的 deb 包:
[Desktop Entry]
Name=OoliteCommunicator
Comment=Oolite Communicator is an add-on for Oolite to allow multiplayer interaction. (check http://oolite.org)
Exec=/opt/oolitecommunicator/bin/OoliteCommunicator
Icon=/opt/oolitecommunicator/lib/OoliteCommunicator.png
Terminal=false
Type=Application
Categories=Unknown
MimeType=
我通过手动添加行来修复该行为
StartupWMClass=com-mycompany-oolitecommunicator-Main
所以我的解决方法是将这一行添加到
- /opt/oolitecommunicator/lib/oolitecommunicator-OoliteCommunicator.desktop
- /usr/share/applications/oolitecommunicator-OoliteCommunicator.desktop
deb安装完成后。我猜 jpackage 的目的并不那么容易......