Is there a way to update all Java related alternatives?

The trick is to use update-java-alternatives (from the java-common package).

So to go for OpenJDK 6 to 7, I used update-java-alternatives -l to get a list of Java alternatives and then used sudo update-java-alternatives -s java-1.7.0-openjdk-amd64 to the JDK.

NOTE: The command above threw the following errors,

update-alternatives: error: no alternatives for mozilla-javaplugin.so.
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so

This is because the openjdk plugin is not installed by default. To fix run

sudo apt-get install icedtea-7-plugin

and rerun update-java-alternatives.


jbro asked the same question at http://ubuntuforums.org/showthread.php?t=1817528 and wrote a script for this issue,

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done

If there isn't a better answer this seems like a solid workaround, but I am assume there must be a better way for update-alternatives to handle this.

I edited the code a little, since it does not let you do the changes before installing them. I added two more lines as follows...

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
echo "-> update-alternatives --install /usr/bin/$alternative $alternative $newpath 1"
update-alternatives --install /usr/bin/$alternative $alternative $newpath 1
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done

< TL;DR > update-java-alternatives uses the .jinfo file to determine which alternatives to switch across but also expects them to have been configured separately.

Create a new .jinfo file and update-alterntive entries if your downloaded JRE/JDK does not switch over with update-java-alternatives

[Details]

To configure it manually:

  1. Decompress your new jdk alongside the existing jdk in /usr/lib/jvm/

  2. Generate a .jdkname.jinfo file by duplicating another .jinfo file in the folder (or grab one from another Ubuntu install: you are after the template as much as anything else).

    The filename .jdkname.jinfo must match the jdk foldername.

    Modify the content to set the header (names) and the file paths (program entries) to match your new install.

    Remove any lines referring to programs omitted in your version and add lines for new programs in /bin

  3. Generate alternatives for all the programs now in your .jinfo package with this template:

    sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/**jdkname**/bin/java 100
    

    (Several related answers have scripted this from the contents of /bin or you can perform regexp search/replace on your .jinfo file to generate the script commands.)

    Note the 100 is just the priority which is considered when setting the jdk version using the auto flag.

  4. Check the java alternatives and switch to use the JDK.

    update-java-alternatives -l  
    update-java-alternatives -s jdkname  
    

    Note that some JDKs do not include the JRE, so either add it or remove those jinfo entries.