JAR files and manifest: Class-Path

K

Karsten Wutzke

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?

Karsten
 
D

Dave Glasser

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("ClassLoader",
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.
 
T

Thomas Schodt

Karsten said:
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 doubt it.
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.).

Can be done in a shell script.

Code:
#!/bin/sh

CP=.
for I in ./lib/*.jar
do
CP=$CP:$I
done
echo "java -classpath \"$CP\" MyClass"
 
H

hiwa

Karsten Wutzke said:
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?

Karsten

Accoding to the tutorial at Sun's site, answer is:

Class-Pass: lib/aaa.jar lib/bbb.jar lib/xyz.jar

Point is: (1)use relative path
(2)delimiter here is space
 
Joined
Jun 10, 2009
Messages
1
Reaction score
0
work around

Maybe it would be useful for someone

I have the same problem and i solved it so

app.jar - my application
lib/ - directory for extensions (jar files)

suppose app.Main - main class

to startup application you can invoke

java -cp "app.jar:lib/*" app.Main

--------------------------------------
mail.ilja_at_yahoo.com
 
Last edited:

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,738
Latest member
JinaMacvit

Latest Threads

Top