首先,这不是从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"/>
有谁知道匹配这些规范的工具是否已经存在?从各种web搜索中,我找到了Launch4J,但这似乎只是用于实际工作的分支,因此不容易移植。我发现JSmooth看起来更有前途——似乎包含Java代码来处理ICO编解码器和操作PE文件——但它是GPL。WinRun4J似乎使用本地代码进行图标操作,尽管我很难跟上它的源代码。Jimi应该可以处理ICO格式(对于这个问题,标准的javax.imageio
似乎也是如此),但我猜没有更新PE资源的工具。
根据我的Eclipse富客户机平台产品构建器,
- Linux需要一个XPM图标
- MacOSX需要ICNS文件
- Solaris需要4个PM图标,大,中,小,小
- Windows(32位)需要6个单独的BMP图像,或一个ICO文件。
你的发行包必须包含所有这些文件才能独立于平台。
我没有在其他平台上工作过,但在Windows上,你可以通过右键单击现有图标并左键单击属性来更改程序图标。左键单击快捷方式选项卡,然后左键单击更改图标按钮。浏览到分发目录,并选择ICO文件。
我相信当你交付发行包时,自动更改Windows图标是可能的。我想这在其他平台上也是可能的。
有PE/COFF 4J项目,它似乎能够做您想做的事情。它是根据通用公共许可证(CPL)授权的。
关于这个的一些注意事项:
-
作者似乎与WinRunJ相同。这个项目实际上有一个PE资源编辑器,称为
RCEDIT.exe
,但是它使用本机窗口调用,正如您自己指出的那样。为什么作者不使用他自己的项目(PE/COFF 4J)来完成这一点,我很不解。这让我担心PE/COFF 4J项目可能会被放弃。 -
PE/COFF 4J的文档页面只提到该项目能够解析PE文件,但作为我可以告诉您可以解析的文件,然后更改一些东西(例如图标资源),然后将图像写回磁盘。
像你一样,我也一直在寻找一个纯Java解决方案,可以在。exe (PE文件)中操作资源,并且空手而来。这是目前为止最好的选择。
在使用本机Win32调用时,替换。exe文件中的图标资源相当简单。当从纯Java中执行此操作时,您必须确保PE文件在写回磁盘时是一致的。我没有深入研究过PE文件格式,但我想在替换/添加资源时,许多引用都会改变,而不仅仅是与您要替换/添加的资源相关的引用。
这是很早就应该做的,但我们刚刚发布了一个开源的Maven插件,可以做到这一点,因为我们有同样的问题。
免责声明:我是这个项目的作者
相关文档请参见:
https://zephyr.sunshower.io/site/
希望这篇文章能帮助到像我一样遇到这个问题的人。
看起来eclipse项目已经编写了一个小java应用程序来替换图标。
eclipse项目中的IconExe
Netbeans中的app.exe和app64.exe似乎在资源部分有以下图标:
48 × 48 32位
32 × 31 32位
48 × 48 8bit
31 × 31 8bit
16 × 16 8bit
我猜32 x 31是一个错误
您只需替换可执行文件资源部分中的第一个ICO或BMP。资源管理器会自动选择该图标作为要显示的图标。