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