2011-12-28 34 views
8

首先,这不是从Java类中制作EXE的常见问题的重复。我不需要那样做。从独立于开源平台的Java代码替换Windows * .exe中的图标

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

该库必须以非病毒开源许可证提供;跨平台(必须在Windows,Linux,Mac,Solaris上运行),因此无法分离某些操作系统特定的辅助工具;并且必须接受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资源的功能。

+0

相关问题:http://stackoverflow.com/questions/1614772/how-to-change-jframe-icon – 2011-12-28 17:52:43

+0

链接的问题指向http://java.net/projects/pe-file-reader,但这是GPL并且似乎只读取,而不是写入PE文件。 – 2012-07-10 18:34:59

回答

2

根据我的Eclipse富客户端平台产品的制造商,

  • Linux需要的XPM图标
  • MacOSX的需要ICNS文件
  • Solaris要求下午4个图标,大,中,小,微型
  • Windows(32位)需要6个独立的BMP图像或ICO文件。

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

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

我确定当您提供分发包时,可以自动执行Windows图标更改。我想在其他平台上是可能的。

+0

有趣的背景信息,但不是我的问题的答案。 – 2011-12-29 18:41:48

0

您只需替换可执行文件资源部分中的第一个ICO或BMP即可。那个是由资源管理器自动选取的图标来显示。

+3

正确的是,替换可执行文件资源部分中的图标是我想要完成的。但问题是如何从基于Java的构建(可能在CI服务器上)运行另一个操作系统。 – 2011-12-29 18:45:50

2

PE/COFF 4J项目似乎能够做你想做的。它根据Common Public License (CPL)获得许可。

上的一些注意事项:

  • 笔者似乎是相同WinRunJ。这个项目实际上有一个PE资源编辑器,叫做RCEDIT.exe,但它在你自己指出的时候使用本机窗口调用。为什么作者没有使用他自己的项目(PE/COFF 4J)来实现这一目标。这让我担心PE/COFF 4J项目可能会被放弃。

  • PE/COFF 4J的文档页面只提到项目能够解析一个PE文件,但作为文件我可以告诉你可以解析,然后改变一些东西(例如图标资源),然后写图像回到磁盘。

和你一样,我也一直在寻找一个纯Java的解决方案,可以在一个.EXE(PE文件)操纵资源,纷纷拿出两手空空。这是目前为止最好的选择。

使用本机Win32调用时,替换.EXE文件中的图标资源相当简单。当你从纯Java中做到这一点时,你必须确保当你写入磁盘时PE文件是一致的。我没有深入研究过PE文件格式,但我想在替换/添加资源时,许多引用都会发生更改,而不仅仅是与要替换/添加的资源相关的引用。

+1

谢谢。不再使用NetBeans,但我在NetBeans RFE中提到了此项目。 (不接受这个答案,只是因为我没有证实它真的可以达到这个目的。) – 2014-03-31 22:36:10

1

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

IconExe from the eclipse project

NetBeans中的APP.EXE和app64.exe似乎有在资源部分后续图标:
48×48的32位
32×31的32位
48×48 8位
31 X 31 8位
16×16 8位

我猜32×31是一个错误

+0

可能是一个很好的起点,虽然它需要ICO输入,所以你首先必须以某种方式转换PNG输入。 – 2014-07-03 15:32:09