指向JAVA_HOME定义的JRE的Java AppBundler应用程序

时间:2013-07-09 10:50:44

标签: java macos java-7

我一直在使用Java Application Bundler将Java应用程序打包为.app。如果我在.app包中包装JRE7,我已设法运行该应用程序。 是否可以将.app(在Info.plist中)配置为指向JAVA_HOME环境变量定义的JRE? 如果我这样做,我得到“无法加载Java运行时环境”!我试图以不同的方式配置JAVA_HOME,但没有成功!

任何人都可以提供任何帮助或建议吗?

2 个答案:

答案 0 :(得分:10)

appbundler应用程序可以使用应用程序包中的嵌入式Java 7 JRE,也可以使用/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home中安装的Java 7 JRE(与Web浏览器插件使用的相同)。他们不能使用/Library/Java/JavaVirtualMachines下安装的 JDK (或其他任何地方),他们肯定不能使用Java 6。

所做的事情不是使用appbundler而是手动构建捆绑包,主要可执行文件是运行java命令的shell脚本来自JAVA_HOME的行工具(如果未设置/Library/Internet Plug-Ins,可能会回退到JAVA_HOME JRE)。这样的脚本将能够支持Java 6和7。

您可以使用YourApp.app/Contents/MacOS/YourApp之类的内容:

#!/bin/sh

PRG=$0

while [ -h "$PRG" ]; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
    if expr "$link" : '^/' 2> /dev/null >/dev/null; then
        PRG="$link"
    else
        PRG="`dirname "$PRG"`/$link"
    fi
done

progdir=`dirname "$PRG"`

if [ -n "$JAVA_HOME" ]; then
  JAVACMD="$JAVA_HOME/bin/java"
elif [ -x /usr/libexec/java_home ]; then
  JAVACMD="`/usr/libexec/java_home`/bin/java"
else
  JAVACMD="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
fi

exec "$JAVACMD" -classpath "$progdir/../Resources/Jars/*" \
       -Dapple.laf.useScreenMenuBar=true \
       my.pkg.MainClass

然后将应用程序的JAR文件放在YourApp.app/Contents/Resources/Jars中,YourApp.app/Contents/Resources/icon.icns中的图标以及YourApp.app/Contents/Info.plist中的以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
        <string>YourApp</string><!-- relative to Contents/MacOS -->
        <key>CFBundleGetInfoString</key>
        <string>My clever application</string>
        <key>CFBundleIconFile</key>
        <string>icon.icns</string><!-- relative to Contents/Resources -->
        <key>CFBundleInfoDictionaryVersion</key>
        <string>8.0</string>
        <key>CFBundleName</key>
        <string>YourApp</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>8.0</string>
</dict>
</plist>

请参阅GATE Developer launcher以获取完整详细信息,但请注意,这是一个稍微复杂的情况,因为.app脚本委托给另一个脚本,而另一个脚本又从外部的位置加载JAR文件.app捆绑包。然而,原则仍然是相同的。

答案 1 :(得分:0)

usr/libexec/java_home -V

匹配Java虚拟机(2): 1.8.271.09(x86_64)“ Oracle Corporation”-“ Java” /库/ Internet插件/JavaAppletPlugin.plugin/Contents/Home 1.8.0_271(x86_64)“ Oracle Corporation”-“ Java SE 8” /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home / Library / Internet插件/JavaAppletPlugin.plugin/Contents/Home

我面临类似的问题,当我将java_home设置为

echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.bash_profile

它设置为 / Library / Internet插件/JavaAppletPlugin.plugin/Contents/Home

所以我做到了 回声导出“ JAVA_HOME =” Library / Java / JavaVirtualMachines / jdk1.8.0_271.jdk / Contents / Home“ >>〜/ .bash_profile

结果进入

Admins-MacBook-Pro:carot arun$ echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

如果需要,您将来也可以编辑它 转到您的用户,在我的情况下为arun文件夹 按Command + Shift +。查看隐藏的文件 在您喜欢的任何编辑器中打开.bash_profile