我创建了一个Maven NetBeans平台应用程序,并通过运行" nbm build-installers"来生成安装程序。目标。这将创建一个.exe,然后用户可以运行该脚本以自动安装我的应用程序。 (在普通的NBPA中,这将是" Package as - > Installers"。两者都有相同的问题)
用户运行安装程序后,会在用户桌面上放置一个快捷方式。但是,对于Windows 7和Windows 8 64位系统,快捷方式指向错误的二进制文件。它指向32位版本。例如,如果我有一个名为" SampleApp"的应用程序,则快捷方式指向" C:\ Program Files \ sampleapp \ sampleapp.exe"和NOT" C:\ Program Files \ sampleapp \ sampleapp64.exe"正如它应该。这两个二进制文件都存在于此文件夹中。
这个问题为我们创造了一个真正的问题,因为应用程序会调出各种特定于体系结构的DLL(32位版本将使用32位dll,64位应该使用64位dll)。
安装程序需要根据用户的操作系统架构创建指向正确二进制文件的快捷方式。
我接受了https://netbeans.org/bugzilla/show_bug.cgi?id=246710的提问,因为我遇到了同样的问题。
任何人都知道如何解决这个问题?感谢
答案 0 :(得分:2)
确实存在一个错误:安装程序将始终创建指向sampleapp.exe
而不是sampleapp64.exe
的链接。这并没有人们预期的那么大的影响力。 exe文件实际上只是一个启动JVM进程的小型启动程序。如果所述JVM是64位,那么无论启动器.exe
实际上是32位二进制文件,你都会得到什么。所以大多数人永远不会在这个bug中看到问题。但是你可能是正确的,如果你使用外部DLL然后它可能是一个问题,不知道。我会接受你的意见并提出解决方案。
好的,真正重要的是你可用的JVM,而不是操作系统本身。我们可以在这里做出一个相当安全的假设:安装应用程序的JVM也将是最终将运行应用程序的JVM。如果您捆绑JRE,这至少总是如此,即使在其他情况下,这也是一个安全的选择。
为了解决问题,您必须使用NBI存根中自己的ConfigurationLogic.java
版本,因为这就是问题所在。
在该文件中,您会看到底部附近
...
...
public static final String EXECUTABLE_WINDOWS =
BIN_SUBDIR
+ ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".exe"; // NOI18N
这需要修复如下:
private static String get64BitSuffix() {
if (SystemUtils.isCurrentJava64Bit()) {
return "64";
} else {
return "";
}
}
...
...
public static final String EXECUTABLE_WINDOWS =
BIN_SUBDIR
+ ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + get64BitSuffix() + get64BitSuffix() + ".exe"; // NOI18N
现在回答一个关于如何在基于Maven的项目中使用自己的ConfigurationLogic.java
的问题:只需谷歌吧。