问题
您的 Mac OS X 应用程序捆绑包是使用与 Oracle 的 Java 7 软件包不兼容的应用程序捆绑程序创建的。例如,您正在使用的捆绑器可能由Apple提供,仅适用于Apple的Java 6系统包。Jar Bundler
苹果已经放弃了对Java的支持,作为Java 7及更高版本的集成系统包。因此,您必须选择Oracle Java 7第三方软件包及其应用程序软件包捆绑解决方案。这允许您在 Mac OS X 10.7.3 及更高版本上创建和部署基于 Oracle Java 7 的应用程序捆绑包。
您面临的潜在技术问题是Apple的基于本机的二进制文件,它使用的格式仅适用于Apple的Java 6 System Packages,而来自Oracle的组合仅适用于Oracle的Java 7软件包。Objective-C
JavaAppLauncher
Info.plist
JavaAppLauncher
Info.plist
当您使用支持Apple的Java 6系统软件包时,它将始终选择Mac上安装的Apple Java 6系统软件包。JavaAppLauncher
有一个视频,Oracle Java平台Mac OS X端口的首席工程师Scott Kovatch在DEVOXX上谈论了Oracle Java 7的应用程序捆绑如何非常详细地工作。
溶液
要创建基于 Mac OS X 10.7.3 及更高版本的应用程序捆绑包,请基于
以上,您必须使用Oracle的应用程序捆绑器
使用Oracle的应用程序捆绑器,您现在可以选择使用Mac上安装的默认Oracle Java 7软件包运行打包的应用程序:
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
或 Oracle Java 7 JRE,您内联到打包的应用程序中
MyJavaMacOSXApp.app/Contents/PlugIns/
请注意: 这两种方法都有优点和缺点,但是如果您想使用捆绑的应用程序转到Apple App Store,则需要使用自己的JRE的最后一种方法。
需要做些什么
- 下载
appbundler-1.0.jar
并将其移至<project>/lib/appbundler-1.0.jar
-
将以下内容添加到您的<project>/build.xml
<property environment="env" />
<taskdef
name="bundleapp"
classname="com.oracle.appbundler.AppBundlerTask"
classpath="lib/appbundler-1.0.jar" />
<target name="bundle">
<bundleapp
outputdirectory="dist"
name="MyJavaMacOSXApp"
displayname="My Java Mac OS X App"
identifier="com.example.MyJavaMacOSXApp"
shortversion="1.0"
applicationCategory="public.app-category.developer-tools"
mainclassname="com.example.MyJavaMacOSXApp">
<runtime dir="${env.JAVA_HOME}" />
<classpath file="dist/MyJavaMacOSXApp.jar" />
</bundleapp>
</target>
注意:您需要替换为您的应用程序数据。您可以在此处找到一些其他选项,因为此示例仅显示了它如何以最简单的形式工作。MyJavaMacOSXApp
AppBundlerTask
运行目标后,您将在目录中找到。bundle
ant bundle
MyJavaMacOSXApp.app
<project>/dist
元素是什么?<runtime dir="${env.JAVA_HOME}" />
Inlining Oracle Java 7 Package (JRE)
上面的 Ant 目标从您的
到
MyJavaMacOSXApp.app/Contents/PlugIns
因此,应用程序包是完全独立的,根本不需要在目标系统上安装Oracle Java 7包(JRE)。就像您可以在以下屏幕截图中看到的这样一个部署:MyJavaMacOSXApp.app
布线默认的 Oracle Java 7 Package (JRE)
如果要使用安装在应用程序捆绑包上的默认 Oracle Java 7 软件包 (JRE) 目标 Mac
-
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
您必须删除
-
<runtime dir="${env.JAVA_HOME}" />
元素。就像您可以在以下屏幕截图中看到的这样一个部署:bundle
MyJavaMacOSXApp.app
来源MyJavaMacOSXApp.java
package com.example;
import java.awt.*;
import javax.swing.*;
public class MyJavaMacOSXApp extends JPanel {
public MyJavaMacOSXApp() {
JLabel versionLabel = new JLabel("java.version=" + System.getProperty("java.version"));
JLabel homeLabel = new JLabel("java.home=" + System.getProperty("java.home"));
setLayout(new BorderLayout());
add(versionLabel, BorderLayout.PAGE_START);
add(homeLabel, BorderLayout.PAGE_END);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("MyJavaMacOSXApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyJavaMacOSXApp newContentPane = new MyJavaMacOSXApp();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
如果我的应用有多个 jar 文件,该怎么办?
只需根据需要添加任意数量的条目即可。<classpath file="dist/additional.jar" />
注意:捆绑任务中元素的顺序不会在捆绑应用的运行时保留。由本机在运行时构建,因为它在 s from 目录中读取。java.class.path
JavaAppLauncher
*.jar
MyJavaMacOSXApp.app/Contents/Java
只是为了完整性,这是这样的:Info.plist
<?xml version="1.0" ?>
<!DOCTYPE plist PUBLIC "-//Apple//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>JavaAppLauncher</string>
<key>CFBundleIconFile</key>
<string>GenericApp.icns</string>
<key>CFBundleIdentifier</key>
<string>com.example.MyJavaMacOSXApp</string>
<key>CFBundleDisplayName</key>
<string>My Java Mac OS X App</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyJavaMacOSXApp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>JVMRuntime</key>
<string>jdk1.7.0_17.jdk</string>
<key>JVMMainClassName</key>
<string>com.example.MyJavaMacOSXApp</string>
<key>JVMOptions</key>
<array>
</array>
<key>JVMArguments</key>
<array>
</array>
</dict>
</plist>
此答案基于的重要文档:
- http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
- http://java.net/projects/appbundler/pages/Home
- http://java.net/downloads/appbundler/appbundler.html
- http://intransitione.com/blog/take-java-to-app-store/
- http://www.parleys.com/#st=5&id=2891&sl=37
还有一个维护良好的appbundler本身的分支,具有更多的功能和错误修复。