Installing OpenJDK 7 on OS X
Last week, I scanned an article and saw there was a Java 7 Webinar. At first, I thought Java 7 was released, but soon after realized it was a Developer Preview. Unfortunately, the download page doesn't have support for OS X. Since it took me a bit of work to figure out how to install OpenJDK 7 on OS X (I'm running Snow Leopard 10.6.7), I figured I'd write down how I did it.
I started off by downloading "OpenJDK 1.7 universal (32/64 bits) from Mac OS/X branch" from the openjdk-osx-build project's downloads (direct link). After downloading, I installed the dmg as normal.
Update Jan 27, 2012:
After installing the dmg, add the following to your ~/.profile and you should be good to go. Thanks to Mark Beaty for the tip.
function setjdk() { if [ $# -ne 0 ];then export JAVA_HOME=`/usr/libexec/java_home -v $@`; fi; java -version; }
Continue with the instructions below if you don't like this technique for some reason.
I don't use Java Preferences to set my JDK, instead I use David Blevin's handy setjdk script. To make this script work with JDK 7 on OS X, I had to make one minor change. On line 40, I added "Contents" to the path for JAVA_HOME:
export JAVA_HOME=$vmdir/$ver/Contents/Home
Update Jan 27, 2012: You no longer need to make this change.
From there, I had to setup some symlinks so everything would work as expected:
cd /System/Library/Java/JavaVirtualMachines/ sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0.jdk
Update Jan 27, 2012: The latest version installs at a different location so the symlink command above should be changed to:
sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0u.jdk 1.7.0.jdk
Lastly, I had my JAVA_HOME set to "/System/Library/Frameworks/JavaVM.framework/Home". I like the shorter (and seemingly more common) "/Library/Java/Home", so I set it back to that in my ~/.profile:
export JAVA_HOME=/Library/Java/Home
On my system, /Library/Java/Home had a symlink to /System/Library/Frameworks/JavaVM.framework/Home, so I changed it to the CurrentJDK that Java Preferences and setjdk use.
cd /Library/Java rm Home ln -s /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Contents/Home
Then I had to add a symlink for 1.7 in the Versions directory.
cd /System/Library/Frameworks/JavaVM.framework/Versions sudo ln -s /System/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents 1.7
After making these changes, I was able to switch to JDK 7 easily.
$ setjdk 1.7 Setting this terminal's JDK to 1.7 ... openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-b00) OpenJDK 64-Bit Server VM (build 21.0-b17, mixed mode)
I was also able to switch back to JDK 6.
$ setjdk 1.6 Setting this terminal's JDK to 1.6 ... java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
Maven Issues
Next, I tried using JDK 7 to build AppFuse. I ran into two issues when I tried to do this. The first was caused by the native2ascii plugin, which has been known to cause issues on non-Mac platforms. Adding the following profile seemed to solve the problem.
<profile> <activation> <jdk>1.7</jdk> </activation> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>native2ascii-maven-plugin</artifactId> <dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.7.0</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> </dependencies> </plugin> </plugins> </build> </profile>
The next issue was with Enunciate and its maven-enunciate-cxf-plugin.
[INFO] ------------------------------------------------------------------------ [ERROR] FATAL ERROR [INFO] ------------------------------------------------------------------------ [INFO] com/sun/mirror/apt/AnnotationProcessorFactory com.sun.mirror.apt.AnnotationProcessorFactory [INFO] ------------------------------------------------------------------------ [INFO] Trace java.lang.NoClassDefFoundError: com/sun/mirror/apt/AnnotationProcessorFactory
It seemed like adding a profile that included tools.jar would solve this, but it doesn't. When I add the dependency directly to the plugin itself, I get the following error:
warning: The apt tool and its associated API are planned to be removed in the next major JDK release. These features have been superseded by javac and the standardized annotation processing API, javax.annotation.processing and javax.lang.model. Users are recommended to migrate to the annotation processing features of javac; see the javac man page for more information. [WARNING] Validation result has errors. error: [core] java.lang.StackTraceElement: A TypeDefinition must have a public no-arg constructor or be annotated with a factory method. 1 error [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------
Hopefully this article helps you get started with Java 7 on OS X. If you have any additional tips, please leave a comment.