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

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

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

JAVA_HOME也正确设置。

我只用于testing目的使用Mac。 我真的需要一些指导。

当我通过selectJRE 7运行Eclipse时,它运行正常。 因此,应用程序没有任何问题。 我在Mac OS X上缺less一些东西。

我的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指向了一些错误的东西。

问题

您的Mac OS X应用程序捆绑软件是使用与Oracle的Java 7软件包不兼容的应用程序捆绑软件创build的。 您使用的打包程序可能是,例如,Apple提供的Jar Bundler ,它只适用于Apple的Java 6系统软件包。

苹果已经放弃了对Java的支持,作为Java 7及更高版本的集成系统包。 因此,您必须selectOracle Java 7第三方包及其应用程序包捆绑解决scheme。 这使您可以在Mac OS X 10.7.3及更高版本上创build和部署基于Oracle Java 7的应用程序包。

您所面临的基本技术问题是苹果的基于Objective-CJavaAppLauncher二进制文件,它在Info.plist使用的格式仅适用于Apple的Java 6系统软件包,来自Oracle的JavaAppLauncher Info.plist组合仅适用于Oracle的Java 7包。

在使用支持Apple的Java 6系统软件包的JavaAppLauncher ,它将始终选取安装在Mac上的Apple Java 6系统软件包。

有一个video ,Oracle的Java平台的Mac OS X端口的首席工程师Scott Kovatch正在DEVOXX上讨论Oracle Java 7的应用程序捆绑如何运行的细节。

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

  • Oracle的Java SE 7(JRE 1.7.x)
  • OpenJDK Java SE 7(JRE 1.7.x)

和以上,你必须使用Oracle的应用程序打包器

  • 包含Ant任务的lib/appbundler-1.0.jar com.oracle.appbundler.AppBundlerTask

使用Oracle的应用程序打包器,您现在可以select使用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> 

    注意:您需要将MyJavaMacOSXAppreplace为您的应用程序数据。 你可以在这里find一些额外的AppBundlerTask选项,因为这个例子只展示了它如何以最简单的forms工作。

  • 使用ant bundle运行bundle目标后,您将在<project>/dist目录中findMyJavaMacOSXApp.app

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

内联Oracle Java 7包(JRE)

上面的Ant目标复制了您的Oracle Java 7包(JRE)

  • JAVA_HOME

  • MyJavaMacOSXApp.app/Contents/PlugIns

所以应用程序包是完全独立的,不需要在目标系统上安装Oracle Java 7包(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(); } }); } } 

如果我的应用程序有多个jar文件呢?

只要添加尽可能多的<classpath file="dist/additional.jar" />条目即可。

注意:绑定应用程序的运行时不保留捆绑任务中元素的顺序。 java.class.path在运行时由本地JavaAppLauncher因为它从MyJavaMacOSXApp.app/Contents/Java目录中读取*.jar


为了完整Info.plist ,这就是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本身,有更多的function和bug修复。

应用程序所需的Java版本很可能在应用程序的元数据中指定。 如果右键单击应用程序并selectShow Package Contents并浏览至Info.plist文件,则应find定义应用程序将使用的JVM的条目。 例如

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

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

你的系统并不是最新的。 我不是说这是造成你的问题。 但为了安全起见,我会向最新和最伟大的angular色迈进。

  1. 通过系统更新将系统angular色转换为Mac OS X 10.8.2
  2. 从苹果电脑安装新的JRE 1.6.0_43,也称为OS X 2013-002
  3. 从苹果安装一个新的JDK 1.6.0_43 OS X 2013-002开发包2013年3月4日 。 为了获得Apple JDK,您必须使用您的Apple ID(免费开发人员帐户)在这里login并search术语“Java for OS X 2013-002 Developer Package”。 不幸的是,这个软件包没有直接的联系。
  4. 删除已过时的Oracle JDK: sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk 。 注意:这是安全的,因为在下一步我们正在安装当前的Oracle JDK 1.7.0_17。
  5. 下载并安装适用于Mac OS X的Oracle JDK 1.7.0_17 。 注意:这也包括来自Oracle的JRE 1.7.0_17。
  6. 重新启动。

从上面完成所有步骤后,请再次提出以下输出:

  1. 你使用哪个OS X版本?
  2. 什么转储命令/usr/libexec/java_home -V出?
  3. 什么转储命令/usr/libexec/java_home出来?
  4. 什么转储命令echo $JAVA_HOME出?
  5. 什么转储命令echo $JAVA_ARCH出?
  6. 什么转储命令/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
  7. 什么转储命令ls /Library/Java/JavaVirtualMachines出?
  8. 什么转储命令/System/Library/Frameworks/JavaVM.framework/Commands/java -version出?

记下你在原始问题中所做的步骤和努力。 所以它反映了你的进步。

更新:解决scheme是用Oracles AppBundlerTask创build一个Mac OS X应用程序包。 有关详细信息,请参阅我的其他答案在这里: https : //stackoverflow.com/a/15271448

编辑:Uwe的令人印象深刻的答案是绝对正确的OP是谁使用AppLauncher。 我最初的问题是,它涉及OSX与Java 6与Java 7的命令行问题。对原始问题的评论显示我错了。 但是,有命令行问题的人可能会发现下面的一个更简单的解决scheme。

ORIGINAL:我的情况看起来和我认为的OP一样:Java 1.7在命令行上完美,但是mvn失败并且抱怨1.6,通用编译使用sbt和IntelliJ工作正常。 我只是开始有困难与mvn编译第三方项目。

我发现这个工作很好,而且要简单得多:

http://www.jayway.com/2013/03/08/configuring-maven-to-use-java-7-on-mac-os-x/

我所需要的只是.profile中的以下内容:

 export JAVA_HOME=`/usr/libexec/java_home -v 1.7` 

设置该variables, mvn运行良好。

尝试安装这个:

http://support.apple.com/kb/dl1572

InteliJ工作的很好,而我仍然在Java SE 7上使用NetBeans。

 java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)