I was recently upgrading a couple of Ubuntu machines to the latest and greatest everything. It’s good to be up-to-date makes me feel like a no-nonsense, can-do developer :). Anyways one of the latest and greatest things that Ubuntu pulled in for me was the latest java 6 (JDK 1.6.0_14). All of a sudden my build started failing with strange coverage errors – I hate it when that happens. After looking around for a bit I found that there was a Cobertura issue with java 1.6.0_14, this one. So I though I’d try and downgrade Java 6 to the previous version (who needs to be fully up-to-date anyway, that stuff is for the birds, the real hardcore developers use the penultimate version, yeah!).
This of course was easier said than done, Ubuntu doesn’t really like it when you try to downgrade stuff. I thought that if I could obtain, or create, a debian package with the version of java that I was after I might just be able to manually install that one (yeah that might work). I was wrong, I did get my hands on the debian package that I needed, but Ubuntu spewed out some gaff about dependencies and … long story short, it didn’t work. Of course I could always forgo the use of the package manager and just manually install java and set up the PATH and JAVA_HOME and so forth but that would make me feel a little unclean so I thought I’d persist and do things the easy hard way.
Eventually (after searching around for ages and eating 2 pieces of candy – Vicks VapoDrops – good for the throat) I found a nice Ubuntu forum thread about how to downgrade a package (this one), so here is the summarised version of how to downgrade a Ubuntu package – more specifically my java 6.
Firstly, we need to find what lower versions of our package are available to us, we use the following command:
1
|
apt-cache showpkg sun-java6-jdk |
This will produce output similar to the following:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Package: sun-java6-jdk Versions: 6-14-0ubuntu1.9.04 (/var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages) (/var/lib/dpkg/status) Description Language: File: /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages MD5: cb47d4c49fa7317c472613b7010ef9d8 6-13-1 (/var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages) Description Language: File: /var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages MD5: cb47d4c49fa7317c472613b7010ef9d8 Reverse Depends: sun-java6-source,sun-java6-jdk 6-14-0ubuntu1.9.04 sun-java6-javadb,sun-java6-jdk 6-14-0ubuntu1.9.04 sun-java6-demo,sun-java6-jdk sun-java6-demo,sun-java6-jdk 6-14-0ubuntu1.9.04 libnb-java2-java,sun-java6-jdk libnb-java2-java,sun-java6-jdk sun-java6-source,sun-java6-jdk 6-13-1 sun-java6-javadb,sun-java6-jdk 6-13-1 sun-java6-demo,sun-java6-jdk sun-java6-demo,sun-java6-jdk 6-13-1 glassfishv2-bin,sun-java6-jdk glassfishv2,sun-java6-jdk Dependencies: 6-14-0ubuntu1.9.04 - sun-java6-bin (5 6-14-0ubuntu1.9.04) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null)) 6-13-1 - sun-java6-bin (5 6-13-1) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null)) Provides: 6-14-0ubuntu1.9.04 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler 6-13-1 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler Reverse Provides: |
There are two versions available in the repository. As we can see the java version we are looking for (6-13-1) is here. However it is worth noting that had we wanted to downgrade several versions back, we would be out of luck as older versions are no longer in the repository.
Now that we see the version that we want we need to do the following to downgrade:
1
|
sudo aptitude install sun-java6-jdk=6-13-1 |
This will produce something along the lines of:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Reading package lists... Done Building dependency tree Reading state information... Done Reading extended state information Initializing package states... Done The following packages are BROKEN: sun-java6-jdk 0 packages upgraded, 0 newly installed, 1 downgraded, 0 to remove and 2 not upgraded. Need to get 17.7MB of archives. After unpacking 1925kB will be freed. The following packages have unmet dependencies: sun-java6-jdk: Depends: sun-java6-bin (= 6-13-1) but 6-14-0ubuntu1.9.04 is installed. The following actions will resolve these dependencies: Remove the following packages: sun-java6-fonts sun-java6-plugin Downgrade the following packages: sun-java6-bin [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -> 6-13-1 (jaunty)] sun-java6-jre [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -> 6-13-1 (jaunty)] Score is 188 Accept this solution? [Y/n/q/?] Y The following packages will be DOWNGRADED: sun-java6-bin sun-java6-jdk sun-java6-jre The following packages will be REMOVED: sun-java6-fonts{a} sun-java6-plugin{a} 0 packages upgraded, 0 newly installed, 3 downgraded, 2 to remove and 2 not upgraded. Need to get 50.7MB of archives. After unpacking 4096kB will be freed. Do you want to continue? [Y/n/?] Y |
If we now run:
1
|
java -version |
We get:
1 2 3 |
java version "1.6.0_13" Java(TM) SE Runtime Environment (build 1.6.0_13-b03) Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02, mixed mode) |
Which is the downgraded java that we were after, sweet!