Karsten Wutzke <kwutzke-> wrote on Tue, 06 Jan
2004 17:24:33 +0100 in comp.lang.java.programmer:
>Hi!
>
>I have a base dir, where the application JAR file resides. In this base
>dir, there's also a lib dir, nothing special really. In this lib dir are
>some user look and feel JAR files, which are supposed to be loaded when
>the application is started via the JAR file.
>
>Is there any way to use the Class-Path entry in the manifest, so that it
>scans that ./lib directory and loads all the JARs in there, *without
>knowing up-front, what these files are*?
>
>I tried
>
>Class-Path: ./lib
>Class-Path: ./lib/
>Class-Path: ./lib/*
>Class-Path: ./lib/*.jar
>
>but none of them work.
>
>Maybe there's some other way, which I don't know of. I simply don't want
>to explicitly deploy the JAR's (versions, size etc.).
>
>Anyway, how do I do it?
Check out my app QueryForm. It does exactly what you are trying to do,
but it doesn't use the manifest Class-Path mechanism. The homepage is
http://qform.sourceforge.net.
It uses a custom classloader to load all of the .jar and .zip files in
a directory called "drivers" which is below the directory where the
application jar file is. These jar files can contain JDBC drivers or
third-party look-and-feels. You load them into the classloader at
runtime like this:
ClassLoader loader = ExtensionClassLoader.getSingleton();
loader.addArchivesInDirectory(new File(pathToLibDirectory));
(See the code in org/glasser/qform/QForm.java for more details on how
it discovers the path to the lib (drivers) directory at runtime.)
Then, when you need a new look and feel, provided you have the class
name, you can do:
ClassLoader loader = ExtensionClassLoader.getSingleton();
Class lafClass = loader.loadClass(lafClassName);
LookAndFeel laf = (LookAndFeel) lafClass.newInstance();
UIManager.setLookAndFeel(laf);
UIManager.getDefaults().put("ClassLoader", lafClassgetClassLoader());
UIManager.getLookAndFeelDefaults().put("ClassLoade r",
lafClass.getClassLoader());
SwingUtilities.updateComponentTreeUI(eachFrame);
The source for ExtensionClassLoader is in
org/glasser/util/ExtensionClassLoader.java. It's released under an
Apache-style license, so you can use it in a closed-source,
proprietary program if you want.
--
Check out QueryForm, a free, open source, Java/Swing-based
front end for relational databases.
http://qform.sourceforge.net