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

2022-09-01 06:23:22

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

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

JAVA_HOME也设置正确。

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

当我通过选择JRE 7与Eclipse一起运行它时,它可以正常运行。因此,该应用程序没有任何问题。我在Mac OS X上缺少一些东西。

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

  • OS X 版本

    10.8

  • /usr/libexec/java_home -V

    Matching Java Virtual Machines (3):
    1.7.0_12, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk   
    1.6.0_37-b06-434, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_37-b06-434, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    
    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home
    
  • /usr/libexec/java_home

    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home
    
  • echo $JAVA_HOME

    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home/
    
  • JAVA_ARCH未设置

  • /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

    java version "1.7.0_12-ea"
    
  • ls /Library/Java/JavaVirtualMachines

    jdk1.7.0_12.jdk
    
  • /System/Library/Frameworks/JavaVM.framework/Commands/java -version

    java version "1.6.0_37"
    

我想我目前的JDK指出了一些错误。


答案 1

问题

您的 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-CJavaAppLauncherInfo.plistJavaAppLauncherInfo.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>
    

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

  • 运行目标后,您将在目录中找到。bundleant bundleMyJavaMacOSXApp.app<project>/dist

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

Inlining Oracle Java 7 Package (JRE)

上面的 Ant 目标从您的

  • JAVA_HOME

  • MyJavaMacOSXApp.app/Contents/PlugIns

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

MyJavaMacOSXApp Inline JRE

布线默认的 Oracle Java 7 Package (JRE)

如果要使用安装在应用程序捆绑包上的默认 Oracle Java 7 软件包 (JRE) 目标 Mac

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

您必须删除

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

元素。就像您可以在以下屏幕截图中看到的这样一个部署:bundleMyJavaMacOSXApp.app

MyJavaMacOSXApp Inline 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();
            }
        });
    }
}

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

只需根据需要添加任意数量的条目即可。<classpath file="dist/additional.jar" />

注意:捆绑任务中元素的顺序不会在捆绑应用的运行时保留。由本机在运行时构建,因为它在 s from 目录中读取。java.class.pathJavaAppLauncher*.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> 

此答案基于的重要文档:

  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本身的分支,具有更多的功能和错误修复。


答案 2

应用程序所需的 Java 版本可能在应用程序的元数据中指定。如果右键单击应用程序并选择“显示包内容”并浏览到该文件,则应找到定义应用程序将使用的 JVM 的条目。例如:Info.plist

    <key>JVMVersion</key>
    <string>1.5</string>

如果应用程序请求,OSX 可能会选择使用较低的 JVM。