【发布时间】:2015-04-30 07:06:53
【问题描述】:
我有一个用 java 编写的程序,我想为其提供原生样式的包装器。我的目标平台是 OSX、Windows 和 Linux。
我现在的 Windows 和 Linux 工作“足够好”。提供一个 windows 安装程序、一个 linux rpm 和一个 linux .deb 会很好,但现在我对我在这两个平台上提供给用户的包比较满意。我认为它相对直观,感觉很原生,并且易于使用。
对于 Windows
- 我使用 launch4j 创建本机可执行文件。
- 我将本机可执行文件、jar、剥离的 JRE 和资源文件打包在 .zip 中
- 用户下载压缩包,解压里面的文件夹,然后双击可执行文件。
虽然这种方法没有安装程序,但我觉得它“足够原生”。
适用于 Linux
- 我有一个简单的 C++ 程序,用作本机 32 位可执行文件,它启动针对我的 jar 文件的 java。
- 我将本机可执行文件、jar、剥离的 JRE 和资源文件打包在 .tar.gz 中
- 用户下载 .tar.gz,解压其中的文件夹,然后双击可执行文件(或从控制台调用)。
虽然我认为通过 .rpms 和 .debs 分发会很好,并至少为 KDE 和 gnome 提供本机图标支持,但我暂时对这个结果也很满意。
这里是本机可执行代码,任何有兴趣的人都可以使用。
/*Compile this on a linux machine to create a local nix executable
g++ -m32 -o executable-name this-file-name.cpp
-m32 forces 32 bit mode, which should help compatibility
*/
#include <stdio.h>
#include <cstdlib>
int main() {
int result = system( "java -jar TARGET_JAR.jar 2> /dev/null > /dev/null " );
if ( result != 0 ) {
printf ( "PROGRAM_NAME requires Java, but Java isn't in your path. Please make sure Java is installed and 'java' is visible in your path. Once you've done that, please run this executable to run PROGRAM_NAME!\n" );
}
}
我打算在即将发布的版本中修改它以使用嵌入式 jre,但这是一个微不足道的更改。
对于 OSX
我还没有工作系统。这是我想要的:
- 用户下载一个 .dmg 文件,其中包含一个 .app。
- 我希望 .app 能够:
- 具有嵌入式 JRE
- 可双击
- 可以使用 ANT 自动构建。
我之前创建这个应用程序的尝试都失败了。我试过了:
Appbundler:我无法让示例工作。我相信问题的根源是在 Windows 环境中工作,但也许我只是做错了。
Rolling my own .app:这失败了,你可以在帖子中看到。
javapackager(包含在 java 8 中):我同样无法让它工作。由于它是一个新工具,因此在野外示例很少,并且该工具似乎不成熟并且专注于webstart;我在尝试创建本机 windows 包时得到的 windows 安装程序是原始的,我无法让它包含其他非 jar 资源。
webstart:我不想要 .jnlps。我不能有图标或嵌入的 jres。
我觉得应该有一种简单的方法来推出我自己的 .app。据我所知,应用程序只是具有特殊结构和 Info.plist 的目录。
但是,我愿意接受任何可行的建议。最后,只要我得到一个在 OSX 上感觉原生并且可以使用 ANT 自动化的包,我会非常高兴。
谢谢!
【问题讨论】:
-
你到底为什么要做这一切?只需创建一个 .jar 文件。只要 Java 配置正确,这将适用于任何操作系统。
-
“只要 Java 配置正确,这将适用于任何操作系统”出于很多原因。总结:为用户提供更好的体验。这需要 Java 8。Java 通常配置不正确。我希望每次都能保证开箱即用。用户不明白 java 是什么。他们不了解 JRE 和 SDK 之间的区别。他们不知道路径是什么,也不知道如何向其中添加 java。他们不知道罐子是什么。他们不知道 jars 应该是可执行的。当我告诉他们时,他们不想更新 java。Jar 文件没有本机图标。等
-
对讨论这一点并不感兴趣。很多很棒的程序(例如 eclipse)都使用这种方法,这也是我想使用的方法。为了让用户的体验更愉快,我愿意做额外的工作。
-
我已经对 Java Application Bundler 进行了快速测试,在 Windows 上构建它,它似乎构建得很好(虽然我没有测试生成的应用程序)。一个警告,您不能使用
runtime选项(它在您的应用程序中嵌入了 JRE 的一个版本)。如图所示here -
我维护一个“本地”包装的 Java 程序并使用类似的方法。对于 Windows,launch4j 和 InnoSetup(安装程序)。对于 Linux,本机二进制文件听起来有点矫枉过正——为什么不只是一个 shell 脚本。对于 OS X,我使用 appbundler 的 fork,它添加了一些其他功能。我使用诸如“productbuild”之类的 XCode 命令行工具来创建安装程序。