用开源跨平台的Java代码替换Windows *.exe中的图标

9

首先,这不是制作Java类的EXE常见问题的重复。我不需要那样做。

为了解决NetBeans RFE #64612,而无需手动步骤,我需要一个Java(6+)库,可以获取一个现有的Windows *.exe文件,并用通用格式的替代品替换其图标。该可执行文件是通用且预构建的(以二进制形式分发),已经知道如何加载特定于应用程序的配置文件,然后使用各种应用程序JAR等启动JRE;唯一的问题是它具有通用图标,我想在纯Java构建的一部分中用应用程序特定的图标替换该图标,使其看起来更漂亮。

图标库必须在非病毒开源许可下提供;跨平台(必须在Windows、Linux、Mac、Solaris上运行),因此不能分叉一些特定于操作系统的辅助工具;并且必须接受PNG输入,尽管EXE必须在XP上运行,所以根据维基百科应嵌入BMP格式。在高层次上,假设Ant作为构建工具,我希望像这样的东西:<replaceicon from="app.exe" to="hello.exe" icon="hello.png"/>

有没有人知道是否已经存在符合这些规格的工具?从各种网络搜索中,我找到了Launch4J,但它似乎只是为了真正的工作而分叉windres,因此不容易移植。我发现JSmooth看起来更有前途——似乎包括处理ICO编解码器和操作PE文件的Java代码——但它是GPL许可证。WinRun4J似乎使用本地代码进行图标操作,尽管我很难跟踪其源代码。Jimi据说可以处理ICO格式(就像标准的javax.imageio一样),但我猜它没有更新PE资源的功能。


相关问题:https://dev59.com/_HI-5IYBdhLWcg3w6dC2 - Gilbert Le Blanc
5个回答

2

有一个PE/COFF 4J项目,似乎能够实现你想要的功能。它是根据通用公共许可证(CPL)许可的。

以下是一些注意事项:

  • 作者似乎与WinRunJ相同。实际上,这个项目中有一个PE资源编辑器,名为RCEDIT.exe,但正如你自己所指出的,它使用本地Windows调用。为什么作者没有使用自己的项目(PE/COFF 4J)来完成这个任务,我不明白。这让我有点担心,也许PE/COFF 4J项目已经被放弃了。

  • PE/COFF 4J的文档页面只提到该项目能够解析PE文件,但据我所知,你可以解析、然后更改某些内容(例如图标资源),然后将图像写回磁盘。

像您一样,我也一直在寻找可以操作.EXE(PE文件)资源的纯Java解决方案,但一直没有找到。这是目前为止最好的选择。
使用本机Win32调用替换.EXE文件中的图标资源相当简单。但是,在纯Java中执行此操作时,必须确保将PE文件写回磁盘时其一致性。我没有深入研究PE文件格式,但我认为在替换/添加资源时,许多引用都会发生更改,而不仅仅是与您要替换/添加的资源相关的引用。

1
谢谢。我不再使用NetBeans,但我在NetBeans RFE中提到了这个项目。(我还没有接受这个答案,因为我还没有验证它是否真的适用于这个目的。) - Jesse Glick

2
根据我的Eclipse Rich Client Platform产品构建器,
  • Linux需要一个XPM图标
  • MacOSX需要一个ICNS文件
  • Solaris需要4个PM图标,大、中、小和微型
  • Windows(32位)需要6个单独的BMP图像或一个ICO文件。
为了实现跨平台,您的分发包必须包含所有这些文件。
我没有使用其他平台,但在Windows上,您可以通过右键单击现有图标并左键单击属性来更改程序图标。单击快捷方式选项卡,然后单击更改图标按钮。浏览到分发目录,选择ICO文件即可。
我相信在交付分发包时自动更改Windows图标是可能的。我想其他平台也是可能的。

2

这个非常晚才发布,但是我们刚刚发布了一个开源的Maven插件,可以解决这个问题。

免责声明:我是这个项目的作者。

关于此的文档可在以下链接中找到:

https://zephyr.sunshower.io/site/

希望这对像我一样遇到这个问题的人有所帮助。


LinuxWindowsExecutableFileIconService 调用了 winercedit.exe。这似乎意味着它不是纯 Java 实现,用于更新 Windows 可移植可执行文件。 - Dave Jarvis

1

看起来Eclipse项目编写了一个小的Java应用程序来替换图标。

Eclipse项目中的IconExe

Netbeans中的app.exe和app64.exe似乎在资源部分具有以下图标:
48 x 48 32位
32 x 31 32位
48 x 48 8位
31 x 31 8位
16 x 16 8位

我猜32 x 31是一个错误。


可能是一个不错的起点,但它需要ICO输入,所以您首先必须以某种方式将PNG输入转换为ICO。 - Jesse Glick

0

您只需在可执行文件的资源部分中替换第一个ICO或BMP。这个图标会被资源管理器自动选取并显示。


4
我会尽力做到最好。需要翻译的内容是:“我想要替换可执行文件资源区域中的图标。但问题是如何从一个可能在其他操作系统上运行(可能在CI服务器上)的基于Java的构建中具体实现这一点。” - Jesse Glick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接