Debian Wheezy (or even Sid) defaults to Java 6. Originally, my computer had openjdk-6-jdk
. I wanted to utilise the newer features in Java 7 such as higher performance and lower memory footprint, and try the Fork-Join framework. Accordingly, I installed openjdk-7-jdk
. It updated the Debian alternatives for Java to point to the newer version. So far, so good!
Dependencies can upset the apple cart
Then, I installed Eclipse using apt-get
. The version of Eclipse installed is 3.7.1, which is fine. However, it pulls in Java 6 as a dependency. I somehow did not pay attention to that. As the installation completed, I noticed several messages informing me that the alternatives for Java were being reset to Java 6. I bit my lip hard! I think that apt-get
should explicitly warn the user if an installation downgrades a package, or more, due to dependencies.
Simple remedy
Fortunately, a simple remedy is possible. But before we begin, we should check the priorities with which both versions are installed. To check the same, issue the following command in a terminal.
> update-alternatives --display javac javac - auto mode link currently points to /usr/lib/jvm/java-6-openjdk-amd64/bin/javac /usr/lib/jvm/java-6-openjdk-amd64/bin/javac - priority 1061 slave javac.1.gz: /usr/lib/jvm/java-6-openjdk-amd64/man/man1/javac.1.gz /usr/lib/jvm/java-7-openjdk-amd64/bin/javac - priority 100 Current 'best' version is '/usr/lib/jvm/java-6-openjdk-amd64/bin/javac'.
Please note the numbers at the end of the full paths of javac
. So, both Java 6 and Java 7 are installed, but Java 6 has a higher priority — 1061 to 100. It is, therefore, considered the best version. We can check where /etc/alternatives/javac
points, too, for confirmation.
The remedy to apply itself utilises update-alternatives
. In order to take care of all the important JDK components in one shot, I collected the commands into a shell script.
> cat up-java-alt.sh #!/usr/bin/env sh # # Update Debian alternatives for Java. update-alternatives --install \ /usr/bin/java java \ /usr/lib/jvm/java-7-openjdk-amd64/bin/java 1100 update-alternatives --install \ /usr/bin/appletviewer appletviewer \ /usr/lib/jvm/java-7-openjdk-amd64/bin/appletviewer 1100 update-alternatives --install \ /usr/bin/apt apt \ /usr/lib/jvm/java-7-openjdk-amd64/bin/apt 1100 update-alternatives --install \ /usr/bin/extcheck extcheck \ /usr/lib/jvm/java-7-openjdk-amd64/bin/extcheck 1100 update-alternatives --install \ /usr/bin/idlj idlj \ /usr/lib/jvm/java-7-openjdk-amd64/bin/idlj 1100 update-alternatives --install \ /usr/bin/jar jar \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jar 1100 update-alternatives --install \ /usr/bin/jarsigner jarsigner \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jarsigner 1100 update-alternatives --install \ /usr/bin/javac javac \ /usr/lib/jvm/java-7-openjdk-amd64/bin/javac 1100 update-alternatives --install \ /usr/bin/javadoc javadoc \ /usr/lib/jvm/java-7-openjdk-amd64/bin/javadoc 1100 update-alternatives --install \ /usr/bin/javah javah \ /usr/lib/jvm/java-7-openjdk-amd64/bin/javah 1100 update-alternatives --install \ /usr/bin/javap javap \ /usr/lib/jvm/java-7-openjdk-amd64/bin/javap 1100 update-alternatives --install \ /usr/bin/jconsole jconsole \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jconsole 1100 update-alternatives --install \ /usr/bin/jdb jdb \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jdb 1100 update-alternatives --install \ /usr/bin/jhat jhat \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jhat 1100 update-alternatives --install \ /usr/bin/jinfo jinfo \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jinfo 1100 update-alternatives --install \ /usr/bin/jmap jmap \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jmap 1100 update-alternatives --install \ /usr/bin/jps jps \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jps 1100 update-alternatives --install \ /usr/bin/jrunscript jrunscript \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jrunscript 1100 update-alternatives --install \ /usr/bin/jsadebugd jsadebugd \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jsadebugd 1100 update-alternatives --install \ /usr/bin/jstack jstack \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jstack 1100 update-alternatives --install \ /usr/bin/jstat jstat \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jstat 1100 update-alternatives --install \ /usr/bin/jstatd jstatd \ /usr/lib/jvm/java-7-openjdk-amd64/bin/jstatd 1100 update-alternatives --install \ /usr/bin/native2ascii native2ascii \ /usr/lib/jvm/java-7-openjdk-amd64/bin/native2ascii 1100 update-alternatives --install \ /usr/bin/rmic rmic \ /usr/lib/jvm/java-7-openjdk-amd64/bin/rmic 1100 update-alternatives --install \ /usr/bin/schemagen schemagen \ /usr/lib/jvm/java-7-openjdk-amd64/bin/schemagen 1100 update-alternatives --install \ /usr/bin/serialver serialver \ /usr/lib/jvm/java-7-openjdk-amd64/bin/serialver 1100 update-alternatives --install \ /usr/bin/wsgen wsgen \ /usr/lib/jvm/java-7-openjdk-amd64/bin/wsgen 1100 update-alternatives --install \ /usr/bin/wsimport wsimport \ /usr/lib/jvm/java-7-openjdk-amd64/bin/wsimport 1100 update-alternatives --install \ /usr/bin/xjc xjc \ /usr/lib/jvm/java-7-openjdk-amd64/bin/xjc 1100
Please note that we used a priority value of 1100, so that we can assign Java 7 a higher priority than that of Java 6. Now, we run the above script, and check again the alternatives status, and where /etc/alternatives/javac
points.
> update-alternatives --display javac javac - auto mode link currently points to /usr/lib/jvm/java-7-openjdk-amd64/bin/javac /usr/lib/jvm/java-6-openjdk-amd64/bin/javac - priority 1061 slave javac.1.gz: /usr/lib/jvm/java-6-openjdk-amd64/man/man1/javac.1.gz /usr/lib/jvm/java-7-openjdk-amd64/bin/javac - priority 1100 Current 'best' version is '/usr/lib/jvm/java-7-openjdk-amd64/bin/javac'.
Enjoy Java 7 again! Don't forget to change the default JVM path in Eclipse, though.
What about the man pages installed as slaves? That part is left as an exercise :-)
No comments:
Post a Comment