应用程序在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-C
的JavaAppLauncher
二进制文件,它在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>
注意:您需要将
MyJavaMacOSXApp
replace为您的应用程序数据。 你可以在这里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
:
接线默认的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
因为它从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>
这个答案的重要文件是基于:
- 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本身,有更多的function和bug修复。
应用程序所需的Java版本很可能在应用程序的元数据中指定。 如果右键单击应用程序并selectShow Package Contents并浏览至Info.plist
文件,则应find定义应用程序将使用的JVM的条目。 例如
<key>JVMVersion</key> <string>1.5</string>
如果应用程序请求,OSX可能会select使用较低的JVM。
你的系统并不是最新的。 我不是说这是造成你的问题。 但为了安全起见,我会向最新和最伟大的angular色迈进。
- 通过系统更新将系统angular色转换为Mac OS X 10.8.2
- 从苹果电脑安装新的JRE 1.6.0_43,也称为OS X 2013-002
- 从苹果安装一个新的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”。 不幸的是,这个软件包没有直接的联系。
- 删除已过时的Oracle JDK:
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk
。 注意:这是安全的,因为在下一步我们正在安装当前的Oracle JDK 1.7.0_17。 - 下载并安装适用于Mac OS X的Oracle JDK 1.7.0_17 。 注意:这也包括来自Oracle的JRE 1.7.0_17。
- 重新启动。
从上面完成所有步骤后,请再次提出以下输出:
- 你使用哪个OS X版本?
- 什么转储命令
/usr/libexec/java_home -V
出? - 什么转储命令
/usr/libexec/java_home
出来? - 什么转储命令
echo $JAVA_HOME
出? - 什么转储命令
echo $JAVA_ARCH
出? - 什么转储命令
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
? - 什么转储命令
ls /Library/Java/JavaVirtualMachines
出? - 什么转储命令
/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)