从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标
Posted
技术标签:
【中文标题】从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标【英文标题】:Replacing icon in Windows *.exe from open-source platform-independent Java code 【发布时间】:2012-01-29 08:46:06 【问题描述】:首先,这不是从 Java 类制作 EXE 的常见问题的重复。我不需要这样做。
要在没有manual steps 的情况下解决 NetBeans RFE #64612 我需要一个 Java (6+) 库,它可以采用 现有 Windows *.exe
文件并将其图标替换为通用格式的替代品.通用和预构建的可执行文件(以二进制形式分发)已经知道如何加载特定于应用程序的配置文件,然后使用各种应用程序 JAR 等启动 JRE;唯一的问题是它有一个通用图标,我想将该图标作为纯 Java 构建的一部分替换为特定于应用程序的图标,这样它看起来更漂亮。
该库必须在非病毒开源许可下可用;跨平台(必须在 Windows、Linux、Mac、Solaris 上运行),因此不能 fork 一些特定于操作系统的帮助工具;并且必须接受 PNG 输入,尽管 EXE 必须在 XP 上工作,所以 according to 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 资源的工具。
【问题讨论】:
相关问题:***.com/questions/1614772/how-to-change-jframe-icon 一个链接的问题指向java.net/projects/pe-file-reader,但这是 GPL 并且似乎只能读取而不是写入 PE 文件。 【参考方案1】:这早就应该了,但我们刚刚发布了一个开源的 Maven 插件,可以做到这一点,因为我们遇到了同样的问题。
免责声明:我是这个项目的作者
相关文档可在以下位置获得:
https://zephyr.sunshower.io/site/
希望这对像我一样偶然发现此问题的人有所帮助。
【讨论】:
不是我的问题的答案,但很有趣。【参考方案2】:看起来eclipse项目写了一个小的java应用程序来替换图标。
IconExe from the eclipse project
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 输入。【参考方案3】:PE/COFF 4J 项目似乎可以做你想做的事。它在Common Public License (CPL) 下获得许可。
一些注意事项:
作者好像和WinRunJ一样。这个项目实际上有一个 PE 资源编辑器,名为RCEDIT.exe
,但正如您自己指出的那样,它使用本机 Windows 调用。为什么作者不使用他自己的项目(PE/COFF 4J)来完成这件事让我很震惊。这让我有些担心 PE/COFF 4J 项目可能被放弃了。
PE/COFF 4J 的文档页面仅提到该项目能够解析 PE 文件,但据我所知,您可以解析文件,然后更改某些内容(例如图标资源),然后编写图像回磁盘。
和你一样,我也一直在寻找一种纯 Java 解决方案,它可以操作 .EXE(PE 文件)中的资源,但结果却空手而归。这是迄今为止最好的选择。
使用本机 Win32 调用时,替换 .EXE 文件中的图标资源相当简单。从纯 Java 执行此操作时,您必须确保在将 PE 文件写回磁盘时它是一致的。我没有深入研究 PE 文件格式,但我认为在替换/添加资源时许多引用会发生变化,而不仅仅是与您要替换/添加的资源相关的引用。
【讨论】:
谢谢。不再使用 NetBeans,但我在 NetBeans RFE 中提到了这个项目。 (不接受这个答案只是因为我还没有验证它是否真的适用于此目的。)【参考方案4】:您只需替换可执行文件资源部分中的第一个 ICO 或 BMP。浏览器会自动选择该图标作为要显示的图标。
【讨论】:
对,替换可执行文件资源部分的图标是我想要完成的。但问题是,具体而言,如何从可能在另一个操作系统(可能在 CI 服务器上)运行的基于 Java 的构建中做到这一点。【参考方案5】:根据我的 Eclipse 富客户端平台产品构建器,
Linux 需要 XPM 图标 MacOSX 需要 ICNS 文件 Solaris 需要 4 个 PM 图标,大、中、小和小 Windows(32 位)需要 6 个单独的 BMP 图像或 ICO 文件。您的分发包必须包含所有这些文件以独立于平台。
我没有使用其他平台,但在 Windows 上,您可以通过右键单击现有图标并左键单击属性来更改程序图标。左键单击快捷方式选项卡,然后左键单击更改图标按钮。浏览到分发目录,然后选择 ICO 文件。
我确信在您交付分发包时可以自动更改 Windows 图标。我想这在其他平台上是可能的。
【讨论】:
有趣的背景信息,但不是我的问题的答案。以上是关于从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标的主要内容,如果未能解决你的问题,请参考以下文章
取代github ?CSDN发布开源代码托管平台 CODE.CHINA
盘点类似于GitHub的代码托管平台码云的度热门项目排行榜TOP 50