Any jar included in JRE’s ext directory is
searched for class files, automatically considered part of the classpath.
Introduction
Simply copying or moving your jar files to the ext
directory pointed to by the system property java.ext.dirs
=C:\Program Files\java\jre6\lib\ext
automatically puts them on the classpath without having to mention them
explicitly. This is a great way to prune back an overblown classpath. It is
safest to put your jars in all the ext directories:
where to look for ext directories :
You never know for sure where your javac.exe
or java.exe is going to look. Grrr. You can
change the location of the ext directory on the command
line.
java.exe -Djava.ext.dirs=C:\mylibs mypackage.MyClass
As of JDK 1.6, you can have as many ext dirs as you
want, and you can put them wherever you please. You must tell Java where to look
for them by setting the java sytem property java.ext.dirs.
Visibility
| Ext Dir Visibility |
| JRE ext |
Browser ext |
JDK ext |
Purpose |
|
|
|
Compiling (finding method signatures to generate correct code to call
methods). |
|
|
|
running applications from local hard disk. |
|
|
|
running Applets from local hard disk. |
|
|
|
running Applets from the web. |
|
|
|
running Java Web Start applications from local hard disk. |
|
|
|
running Java Web Start applications from the web. |
ext dir with Applets
With Applets you normally arrange to preinstall any large jar files. Then you
are stuck with the problem of where to them and how to you arrange to get them
on the classpath. You can use Java Web Start or
you can scatter them and have the user configure a custom classpath or you can
use the ext directory. Sometimes you will have so many
jar files, you can’t fit them all on the classpath. What you can do then
is look at the system property,
System.getProperty( "java.ext.dirs" );
which you can view by running wassup as
an application or Applet. Then put the jar in the corresponding directory, e. g.
java.ext.dirs = C:\Program Files\Java\jre1.6.0_17\lib\ext
Any jars jars in the ext directory will automatically
be found without putting them on the classpath.
- Opera will likely be in C:\Program Files\java\jre6\lib\ext;C:\Windows\Sun\Java\lib\ext
- Chrome will likely be in C:\Program Files\java\jre6\lib\ext;C:\Windows\Sun\Java\lib\ext
- Netscape 4.79 will likely be in Program Files\Netscape\Communicator\Program\Java\classes
- IE 5.5 will likely be in WINNT\Java\Packages
- Netscape 8.0 will likely be in jre6\lib\ext
Oddly, other browsers, Flock, Avant, Safari, Sea Monkey and Firefox, don’t
seem to have an java.ext.dirs property. If you can
shed any light on this mystery, please let me know.
There are at least two ext directories:
where additional jars on the path are kept :
java.exe uses the JRE
version and where javac.exe uses the debugging JDK
version.
Mac OS X
I don’t have a Mac myself, so I cannot verify this information’s
current accuracy. Mac OS X PowerPC computers support up to to Java 1.5.
The Intel versions support up to 1.6, but only 64-bit.
Macs have four ext directories:
- ~/Library/Java/Extensions (for this user only) (may
have to be manually created).
- /Library/Java/Extensions (system wide).
- /System/Library/Java/Extensions
- /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext
You should probably use (1) or (2) for your own additions.
Automating
Sooner or later you will have to reinstall the JDK/JRE and you will lose your ext
directories.
You can quickly rebuild them if you
maintain a bat file like this and run it after every JRE/JDK install. Adjust the
file to account for where your ext dirs are and where
the jars are you need.
Downsides
The main problems with the extdir technique are:
- You can’t deal with two versions of the same jar. With classpath, you can
select one or the other version as the need arises.
- There are two different ext directories per JVM
installed. You need to propagate your jars to all of them. Often you forget when
you upgrade your JVM.
Learning More
Sun’s JDK Technote Guide on
ext mechanism : available: