Update-alternatives
Here are some notes on update-alternatives
and some examples demonstrating its
use. The purpose of the update-alternatives utility program is to manage,
on a single machine, serveral versions of programs that all provide the same
functionality.
Contents
Synopsis
Excerpts from the update-alternatives man page:
It is possible for several programs fulfilling the same or similar functions to be installed on a single system at the same time. Debian’s alternatives system aims to manage this situation. A generic name in the filesystem is shared by all files providing interchangeable functionality. The alternatives system and the system administrator together determine which actual file is referenced by this generic name.
The generic name is not a direct symbolic link to the selected alternative. Instead, it is a symbolic link to a name in the alternatives directory, which in turn is a symbolic link to the actual file referenced. This is done so that the system administrator’s changes can be confined within the /etc directory.
When each package providing a file with a particular functionality is installed, changed or removed, update-alternatives is called to update information about that file in the alternatives system.
Examples
Eclipse
Eclipse seems idosyncratic and tempremental to me, and I have found various versions working well sometimes and poorly other times. Also, there are useful plugins that are only available for some versions and not others.
I currently have three versions of Eclipse installed—a version from TypeSafe and two simultaneous releases: Kepler and Luna (a developer build). (The version from TypeSafe is just a Kepler release with the Scala IDE plugin preinstalled. Note that you can manually install the Scala IDE plugin with other versions Eclipse.) This section describes how to get these multiple versions of Eclipse to happily coexist on the same machine.
If you don’t already have any Eclipse versions installed, see the appendix for some installation links and tips.
Create startup scripts This step may become optional in the future, but it seems for now it provides a workaround to deal with bugs in Ubuntu and/or Eclipse that effect the Eclipse menus.
For each version of Eclipse, create a startup script that includes any options that
would otherwise be added to the command line when launching Eclipse.
For example, in the file $HOME/opt/Eclipse/kepler/eclipse-kepler
, put
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/kepler/eclipse -vmargs -Xmx4096M
The option -vmargs -Xmx4096M
sets the available memory to 4096 Mb. You can
either adjust or remove this parameter to suit your hardware. In fact, this
seems to cause problems with some versions of the IDE, so it may be safer to
leave it off unless you run into memory problems without it.
See this page for more about the vmargs command line uption.
The line export UBUNTU_MENUPROXY=0
was added to work around
a bug
that causes problems with Eclipse’s menus.
Now, make the file you just created executable; e.g.,
chmod a+x $HOME/opt/Eclipse/kepler/eclipse-kepler
To summarize, here are three example startup scripts I use for three different versions of Eclipse:
In the file $HOME/opt/Eclipse/luna/eclipse-luna
,
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/luna/eclipse
In the file $HOME/opt/Eclipse/kepler/eclipse-kepler
,
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/kepler/eclipse
In, the file $HOME/opt/Eclipse/scala/eclipse-scala
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/scala/eclipse
Assuming each of your versions of Eclipse is stored in it own directory under
$HOME/opt/Eclipse
(as described in the appendix),
you can now configure these various versions of Eclipse by invoking the
following at the command line:
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/scala/eclipse-scala 400
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/luna/eclipse-luna 300
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/kepler/eclipse-kepler 200
The numbers 200, 300, 400 indicate the respective priorities, and since scala has the highest number, it will be the default program (but we can change the default later).
You can remove any alternative that you added accidentally. For example,
sudo update-alternatives --remove eclipse $HOME/opt/Eclipse/scala/eclipse-scala
The command update-alternatives --query eclipse
should now print something
like this:
Name: eclipse
Link: /usr/bin/eclipse
Status: auto
Best: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala
Value: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala
Alternative: /home/williamdemeo/opt/Eclipse/kepler/eclipse-kepler
Priority: 200
Alternative: /home/williamdemeo/opt/Eclipse/luna/eclipse-luna
Priority: 300
Alternative: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala
Priority: 400
Now, or later, you can change the priority of these three alternative versions of
Eclipse with the command update-alternatives --config eclipse
, which
should output the following:
There are 3 choices for the alternative eclipse (providing /usr/bin/eclipse).
Selection Path Priority Status
------------------------------------------------------------
* 0 /home/williamdemeo/opt/Eclipse/scala/eclipse-scala 400 auto mode
1 /home/williamdemeo/opt/Eclipse/kepler/eclipse-kepler 200 manual mode
2 /home/williamdemeo/opt/Eclipse/luna/eclipse-luna 300 manual mode
3 /home/williamdemeo/opt/Eclipse/scala/eclipse-scala 400 manual mode
If you want to create an application launcher for the Unity dash for any of these alternatives, or any program for that matter, do so as follows:
mkdir -p ~/.local/share/applications
gnome-desktop-item-edit --create-new ~/.local/share/applications/
Click on the icon in the dialog box that pops up, and choose, for
example, $HOME/opt/Eclipse/scala/icon.xpm
. Fill in the rest of the dialog box
as appropriate. For example, you want the Command field to point to one of the bash
scripts we created above—like $HOME/opt/Eclipse/scala/eclipse-scala
—and
not directly to an eclipse
command.
Java
After downloading JDK 7 from the Oracle JDK 7 downloads page. I unpacked it and moved it to a directory called /usr/lib/jvm/jdk1.7.0/. I then made it the default Java on my machine using the commands below. (The first block of 9 commands can be copy-and-pasted to the command line all at once.)
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0/bin/java" 1;
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0/bin/javac" 1;
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0/bin/javaws" 1;
sudo update-alternatives --install "/usr/bin/jcontrol" "jcontrol" "/usr/lib/jvm/jdk1.7.0/bin/jcontrol" 1;
sudo chmod a+x /usr/bin/java;
sudo chmod a+x /usr/bin/javac;
sudo chmod a+x /usr/bin/javaws;
sudo chmod a+x /usr/bin/jcontrol;
sudo chown -R root:root /usr/lib/jvm/jdk1.7.0;
The following commands are interactive and should be invoked individually:
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javaws
sudo update-alternatives --config jcontrol
Ruby
This example comes from an old forum post
# install ruby1.8 & friends with priority 500
# so this will be the default "auto" choice
update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.8 500 \
--slave /usr/share/man/man1/ruby.1.gz ruby.1.gz \
/usr/share/man/man1/ruby.1.8.gz \
--slave /usr/bin/ri ri /usr/bin/ri1.8 \
--slave /usr/bin/irb irb /usr/bin/irb1.8
# install ruby1.9 & friends with priority 400
update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.9 400 \
--slave /usr/share/man/man1/ruby.1.gz ruby.1.gz \
/usr/share/man/man1/ruby.1.9.gz \
--slave /usr/bin/ri ri /usr/bin/ri1.9 \
--slave /usr/bin/irb irb /usr/bin/irb1.9
# choose your interpreter
# changes symlinks for /usr/bin/ruby ,
# /usr/bin/irb, /usr/bin/ri and man (1) ruby
update-alternatives --config ruby
Appendix
Installing multiple versions of Eclipse
-
Make a directory under your home directory called
~/opt/Eclipse
. -
Download the versions of Eclipse you want to try—e.g., Luna, Kepler, the version from TypeSafe—and place the tar.gz files in
~/opt/Eclipse
. -
Untar each tar.gz file, and rename it appropriately. For example,
tar xvzf eclipse-standard-luna-M6-linux-gtk-x86_64.tar.gz mv eclipse luna
That is, each time you untar one of these files, the resulting directory will be called eclipse. You should change the name eclipse to the name of the version so that they don’t conflict with one another.
In the end you should have, say, three directories:
~/opt/Eclipse/luna ~/opt/Eclipse/kepler ~/opt/Eclipse/scala
each one containing a different version of Eclipse. Now you can follow the instructions above to get them configured as alternatives in Linux.
Out of Memory Errors
If you are getting out of memory erros when running your programs in Eclipse, check out this page.