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

2024-04-22

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

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

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 指向了错误。


Issue

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

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

您面临的根本技术问题是 Apple 本身的Objective-C based JavaAppLauncher二进制及其使用的格式Info.plist仅适用于 Apple 的 Java 6 系统包和JavaAppLauncher Info.plist来自 Oracle 的组合仅适用于 Oracle 的 Java 7 包。

当您使用JavaAppLauncher支持 Apple 的 Java 6 系统包,因此它将始终选择 Mac 上安装的 Apple Java 6 系统包。

有一个,Oracle Java 平台 Mac OS X 移植首席工程师 Scott Kovatch 在 DEVOXX 上详细介绍了 Oracle Java 7 的应用程序捆绑是如何工作的。

Solution

创建基于 Mac OS X 10.7.3 及更高版本的应用程序包

  • Oracle 的 Java SE 7 (JRE 1.7.x) http://docs.oracle.com/javase/7/docs/webnotes/install/mac/mac-jdk.html
  • OpenJDK Java SE 7 (JRE 1.7.x) http://openjdk.java.net/projects/macosx-port/

及以上,您必须使用 Oracle 的应用程序捆绑器

  • lib/appbundler-1.0.jar http://java.net/projects/appbundler/downloads/download/appbundler-1.0.jar包含 Ant 任务com.oracle.appbundler.AppBundlerTask http://java.net/downloads/appbundler/appbundler.html

借助 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 http://java.net/projects/appbundler/downloads/download/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与您的应用程序数据。你可以找到here http://java.net/downloads/appbundler/appbundler.html一些额外的AppBundlerTask选项,因为此示例仅显示它如何以最简单的形式工作。

  • 运行后bundle目标与ant bundle你会找到MyJavaMacOSXApp.app in the <project>/dist目录。

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

内联 Oracle Java 7 包 (JRE)

上面的 Ant 目标从您的 Oracle Java 7 Package (JRE) 复制

  • JAVA_HOME

into

  • MyJavaMacOSXApp.app/Contents/PlugIns

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

连接默认的 Oracle Java 7 包 (JRE)

如果您想使用安装在应用程序包目标 Mac 上的默认 Oracle Java 7 包 (JRE)

  • /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" />根据您的需要输入。

注意:捆绑应用程序运行时不会保留捆绑任务中元素的顺序。这java.class.path由本机在运行时构建JavaAppLauncher正如它在*.jars from 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> 

该答案所依据的重要文件:

  1. http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
  2. http://java.net/projects/appbundler/pages/Home http://java.net/projects/appbundler/pages/Home
  3. http://java.net/downloads/appbundler/appbundler.html http://java.net/downloads/appbundler/appbundler.html
  4. http://intransitione.com/blog/take-java-to-app-store/ http://intransitione.com/blog/take-java-to-app-store/

appbundler 本身还有一个维护良好的分支,具有更多功能和错误修复。

  • https://bitbucket.org/infinitekind/appbundler https://bitbucket.org/infinitekind/appbundler
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 空 EntityManager/EJB 注入 MDB

    我有一个消息驱动 bean MDB 部署到 WebLogic 12 1 3 我尝试使用 PersistenceContext 注释将实体管理器注入 MDB 但实体管理器为空 我还尝试注入一个简单的无状态会话 bean 它也是空的 但是 Me
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 通过 JNI 从 Applet 调用 DLL

    我有一个 概念验证 的作品 它跨越了一些不熟悉的领域 我的任务是将 EFTPOS 机器连接到在内联网浏览器中作为小程序运行的应用程序 我暂时忽略了 EFTPOS dll 并用我选择的语言 Delphi 创建了一个简单的 JNI 修饰的 DL
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 在当前参数寄存器中找到的选择器名称:isEqual:

    我正在寻求一些帮助来消除 OSX 应用程序中的一个我无法解决的错误 我收到以下记录错误 Selector name found in current argument registers isEqual 但我一生都无法弄清楚它来自哪里 因为
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • 使用 Cucumber Scenario Outline 处理 Excel 电子表格

    如果可能的话 我试图找到一种更优雅的方法来处理从与 Excel 电子表格行 第 n 个 相关的 Cucumber Scenario Outline 中调用第 n 个数字 目前 我正在使用迭代编号来定义要从中提取数据的 Excel 电子表格的
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • java中的回调是什么[重复]

    这个问题在这里已经有答案了 可能的重复 什么是回调函数 https stackoverflow com questions 824234 what is a callback function 我已经阅读了回调的维基百科定义 但我仍然没有明

随机推荐