应用程序在Mac OS X上使用Apple的Java 6而不是Oracle的Java 7?

amo*_*mod 35 java macos bundle java-7

我正在使用安装了Oracle的Java 7的Mac OS X测试我当前的应用程序.而是使用Oracle的Java 7,它使用的是Apple的Java 6.的默认的系统输出java -version被示出7.

我尝试了不同网站中提到的大部分内容,但我无法解决此问题.

JAVA_HOME 也正确设置.

我仅将Mac用于测试目的.我真的需要一些指导.

当我通过选择JRE 7运行Eclipse时,它运行正常.因此,应用程序没有任何问题.我在Mac OS X上遗漏了一些东西.

我的Java系统环境如下所示:

我想我现在的JDK指的是错误的.

Uwe*_*her 90

问题

您的Mac OS X应用程序包是使用与Oracle的Java 7程序包不兼容的应用程序打包程序创建的.例如,您使用的捆绑包可能Jar Bundler由Apple提供,仅适用于Apple的Java 6系统包.

Apple已经放弃了Java作为Java 7及更高版本的集成系统包的支持.因此,您必须使用Oracle Java 7第三方软件包及其应用程序包捆绑解决方案.这允许您在Mac OS X 10.7.3及更高版本上创建和部署基于Oracle Java 7的应用程序包.

您面临的基本技术问题是Apple Objective-C基于本机的JavaAppLauncher二进制文件,其使用的格式Info.plist仅适用于Apple的Java 6系统软件包,而JavaAppLauncher Info.plist来自Oracle 的组合仅适用于Oracle的Java 7软件包.

当您使用JavaAppLauncher支持Apple的Java 6系统软件包时,它将始终选择Mac上安装的Apple Java 6系统软件包.

有一个视频,甲骨文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>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:您需要替换MyJavaMacOSXApp您的应用程序数据.您可以在此处找到一些其他AppBundlerTask选项,因为此示例仅显示其最简单形式的工作方式.

  • 运行bundle目标后,ant bundle您将MyJavaMacOSXApp.app<project>/dist目录中找到.

什么是<runtime dir="${env.JAVA_HOME}" />元素?

内联Oracle Java 7包(JRE)

上面的Ant目标从您的Java Java 7程序包(JRE)复制

  • JAVA_HOME

  • MyJavaMacOSXApp.app/Contents/PlugIns

因此,应用程序包完全是自包含的,根本不需要在目标系统上安装Oracle Java 7 Package(JRE).就像你在下面这样一个部署的屏幕截图中看到的那样MyJavaMacOSXApp.app:

MyJavaMacOSXApp内联JRE

接线默认Oracle Java 7包(JRE)

如果要使用应用程序包目标Mac下安装的默认Oracle Java 7程序包(JRE)

  • /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/

你必须删除

  • <runtime dir="${env.JAVA_HOME}" />

bundle任务中的元素.就像你在下面这样一个部署的屏幕截图中看到的那样MyJavaMacOSXApp.app:

MyJavaMacOSXApp内联JRE

来源 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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我的应用有多个jar文件怎么办?

只需添加<classpath file="dist/additional.jar" />所需数量的条目即可.

注意:捆绑任务中的元素顺序不会在捆绑应用程序的运行时保留.当从源目录中读取s java.class.path时,本机在运行时构建.JavaAppLauncher*.jarMyJavaMacOSXApp.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> 
Run Code Online (Sandbox Code Playgroud)

此答案的重要文件基于:

  1. http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
  2. http://java.net/projects/appbundler/pages/Home
  3. http://java.net/downloads/appbundler/appbundler.html
  4. http://intransitione.com/blog/take-java-to-app-store/
  5. http://www.parleys.com/#st=5&id=2891&sl=37

还有一个维护良好的appbundler分叉,有更多的功能和错误修正.

  • @ amod0017我改变了帖子.您可以在"如果我的应用程序有多个jar文件怎么办?"下找到它.Oracles AppBundler将保留你在'MyJavaMacOSXApp.app/Contents/Java'目录中的所有`*.jar.我希望这个答案对你有帮助,如果你认为这是你问题的答案我会很感激,如果你把这个答案标记作为你问题的答案(绿色勾号). (2认同)
  • @ lance-roberts感谢您在我的帖子中修复拼写错误的努力.我喜欢评论,特别是如果这样的话. (2认同)