I didn’t upgrade to Mavericks right away because I was getting FIOS. If there were internet problems, I wanted to know they were Verizon’s fault and not be in a position where they could claim it was my computer’s problem. I’ve had Mavericks long enough that I can write about the experience.
The problems describe here:
- git
- Eclipse/Java/Ant/JMockIt
- OpenOffice crashing
How long it took
Not counting the download, the install took 2 hours. Much of which was Apple saying there were “17 minutes” left. I left it alone and it didn’t finish though. I’ve seen reports of significantly faster installs though.
Problem #1 – git
The first problem I ran into was the error message The “git” command requires the command line developer tools. Not a big deal. It was a two minute install. I was just surprised as I was expecting what was installed before the upgrade to be installed after.
Problem #2 – Java and Eclipse
And now for the meat of this. Being able to develop again in Eclipse was by no means seemless.
Error: Ant can’t find Java
Exact message: Specified VM install not found: type MacOS X VM, name Java SE 6 (MacOS X Default)
Solution – for each Ant build:
- Run > External Tools Configuration
- Run in same JRE as the workspace
Error: JUnit tests don’t run in Eclipse view
When running from Eclipse, I got the stack trace:
java.lang.IllegalStateException: Unable to load Java agent; please add lib/tools.jar from your JDK to the classpath at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:102) at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:74) at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:41) at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:271) at org.junit.runner.Runner.<clinit>(Runner.java:25) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) java.lang.NoClassDefFoundError: org.junit.runner.Runner at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Solution:
First I tried switching creating a new installed JVM of type MacOS X JVM. That didn’t help directly. I left it like that since I didn’t want to muck around with my original configuration. Then I added tools.jar to the installed JRE.
- Eclipse > Preferences
- Java > Installed JREs
- Click target JRE
- Edit
- Add external jars
- Add /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/lib/tools.jar
Warning: The first time I tried this procedure, Eclipse hung. I had it to kill it. When I opened my workspace, I saw “unable to load plugin x” in every single view. I used Time Machine to restore to before I tried changing the JREs and then re-did that change. The second time it was successful.
I could have added tools.jar to my classpath for the project instead. I choose not to because I was hoping updating it in the JVM install would solve the Ant problem (described below) as well. It didn’t. I also didn’t want to change the project .classpath as that is shared in Subversion and I didn’t want to make a change that affects others.
This whole exercise felt like a hack until I read the JMockIt instructions. This leads me to believe I was running with a different JDK before the Mavericks upgrade.
If you are developing on a JDK of version 1.6 or newer on Mac OS X, add <jdkDir>/lib/tools.jar
to the classpath, where <jdkDir>
is the home directory for your local JDK 1.6 installation.
Error: JUnit tests don’t run from Ant
When running from Ant, every test failed with:
Caused an ERROR</span> <pre> null java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
What I learned:
- I tried setting JAVA_HOME at the command line to no avail. I confirmed javac is on the path. (/usr/bin/javac); it was.
- I tried adding tools.jar to the classpath in launch configuration in Eclipse for running Ant.
- If I change to fork=”no” in the <junit> task in the Ant script, most of the tests pass. (Some of them require the JVM be forked which is why it was in the first place.) Showing the problem is when a new JVM is created, it doesn’t inherit the tools.jar from the previous step.
- If I hard code the classpath entry for tools.jar in the Ant build file, all of the tests pass.
Solution:
If you need to fork the JVM, add the following insider you <junit> task.
<classpath location="/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/lib/tools222.jar" />
I don’t like this solution. I also didn’t like the hack for Eclipse so my unease is pretty uniform here. Luckily Ant doesn’t choke if you include a file (or disk or filesystem) in the classpath that doesn’t exist. Which means this won’t hurt others working on the same project.
Problem #3 – Open Office crashes when opening a document
The solution was to upgrade from Open Office 3.3.0 to the latest (4)
My favorite new feature
It’s a minor one, but I like the feature to synchronization of “Read Later” between my Mac and iPad. (I haven’t tried it yet so it may not be that nice in practice.) Most of the new features are things I don’t need.
Added open office crash
I just ran into this. The path is now “…/jdk1.7.0_55.jdk/…” with the most current JDK. So I guess it might keep changing as Java gets updated.
The jmockit solution didn’t work for me with Java 8.