Any jar included in JRE (Java Runtime Environment) ’s ext directory is
searched for class files, automatically considered part of the classpath.
Simply copying or moving your jar files to the
ext directory pointed to by the system property java.ext.dirs =
\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:
You never know for sure where your javac.exe or
java.exe is going
where to look for ext directories :
java.exe -Djava.ext.dirs=C:\mylibs mypackage.MyClass
As of Java version 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 system property java.ext.dirs.
To find out which ext dir java.exe is loading from, use
the -verbose:class command line option to dump out the
source of each class as it is loaded.
To my surprise, I caught java loading classes from the ext
directory in preference to the copies in the application jar.
|Ext Dir Visibility|
||JDK (Java Development Kit) ext
||Compiling (finding method signatures to generate correct code to call
||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
java.ext.dirs = C:\Program Files\Java\jre1.8.0_121\lib\ext
Any jars jars in the ext directory will automatically be
found without putting them on the classpath.
There are at least two ext directories:
java.exe uses the JRE
and where javac.exe uses the debugging
where additional jars on the path are kept :
Mac OS (Operating System) X
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 version 1.5. The Intel versions support up to
1.6, but only 64-bit. Macs have four ext directories:
You should probably use (1) or (2) for your own additions.
- ~/Library/Java/Extensions (for this user only) (may
have to be manually created).
- /Library/Java/Extensions (system wide).
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.
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 (Java Virtual Machine)
installed. You need to propagate your jars to all of them. Often you forget when
you upgrade your JVM.