9

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

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

该库必须在非病毒开源许可下可用;跨平台(必须在 Windows、Linux、Mac、Solaris 上运行),因此不能 fork 一些特定于操作系统的帮助工具;并且必须接受 PNG 输入,尽管 EXE 必须在 XP 上运行,因此根据 Wikipedia应该嵌入 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 资源的工具。

4

5 回答 5

2

根据我的 Eclipse 富客户端平台产品构建器,

  • Linux 需要 XPM 图标
  • MacOSX 需要 ICNS 文件
  • Solaris 需要 4 个 PM 图标,大、中、小和小
  • Windows(32 位)需要 6 个单独的 BMP 图像或一个 ICO 文件。

您的分发包将必须包含所有这些文件以独立于平台。

我没有使用其他平台,但在 Windows 上,您可以通过右键单击现有图标并左键单击属性来更改程序图标。左键单击快捷方式选项卡,然后左键单击更改图标按钮。浏览到分发目录,然后选择 ICO 文件。

我确信在您交付分发包时可以自动更改 Windows 图标。我想这在其他平台上是可能的。

于 2011-12-28T18:31:05.280 回答
2

PE/COFF 4J项目似乎可以做你想做的事。它是根据通用公共许可证 (CPL)获得许可的。

对此的一些说明:

  • 作者似乎与WinRunJ相同。这个项目实际上有一个 PE 资源编辑器,名为RCEDIT.exe,但正如您自己指出的那样,它使用本机 Windows 调用。为什么作者不使用他自己的项目(PE/COFF 4J)来完成这件事让我很震惊。这让我有些担心 PE/COFF 4J 项目可能被放弃了。

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

和你一样,我也一直在寻找一个纯 Java 解决方案,它可以操作 .EXE(PE 文件)中的资源,但空手而归。这是迄今为止最好的选择。

使用本机 Win32 调用时,替换 .EXE 文件中的图标资源相当简单。从纯 Java 执行此操作时,您必须确保将 PE 文件写回磁盘时是一致的。我没有深入研究 PE 文件格式,但我认为在替换/添加资源时许多引用会发生变化,而不仅仅是与您要替换/添加的资源相关的引用。

于 2014-02-18T16:02:30.003 回答
2

这已经很久了,但我们刚刚发布了一个开源的 Maven 插件,可以做到这一点,因为我们遇到了同样的问题。

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

这方面的文档可在以下位置获得:

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

希望这对像我一样偶然发现这一点的人有所帮助。

于 2020-07-07T22:51:00.827 回答
1

看起来 eclipse 项目已经编写了一个小的 java 应用程序来替换图标。

来自 Eclipse 项目的 IconExe

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

我猜 32 x 31 是个错误

于 2014-07-01T21:06:38.447 回答
0

您只需替换可执行文件资源部分中的第一个 ICO 或 BMP。资源管理器会自动选择该图标作为要显示的图标。

于 2011-12-28T19:07:13.840 回答