[java] Jar externe et classLoader

mpergand

Membre actif
10 Novembre 2003
220
18
J'ai un fichier jar qui utilise la librairie Cocoa, si j'incorpore ce fichier jar dans le bundle de l'appli (merge) pas de problème, par contre, si je le mets en externe dans le dossier /library/Java/Extensions/ , j'ai un ClassNotFoundException sur NSObject.

Je comprends vaguement qu'il s'agit d'un problème de ClassLoader (les libs externes n'ont pas le même ClassLoader ?) mais je ne sais pas le résoudre

En fait ce que je voudrais, c'est avoir accès aux packages
com.apple.cocoa.foundation et com.apple.cocoa.application

A l'aide !
 
Hello.

J'avoue que je ne comprends pas trop bien ton problème. Pourquoi vouloir mettre ton .jar dans /Library/Java/Extensions ? C'est pas une solution pour déployer facilement ça non ?

Sinon, pour les .jar externes, il faut soit les ajouter au classpath (Ex.: java -classpath mylib.jar MyMainClass), ou alors les charger dynamiquement dans le code, mais pour ça, il faut utiliser un ClassLoader et ensuite utiliser la reflection.

Voici un exemple de code pour charger tous les .jar d'un dossier :

Bloc de code:
		ClassLoader jarClassLoader = null;
		File addonsDir = new File("path/to/the/directory");
		File[] jars = addonsDir.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				return name.endsWith(".jar");
			}
		});
		List urls = new LinkedList();
		for (int i = 0; i < jars.length; i++) {
			try {
				URL url = jars[i].toURL();
				urls.add(url);
			} catch (MalformedURLException e) {}
		}
		jarClassLoader = new URLClassLoader((URL[])urls.toArray(new URL[urls.size()]));

Et sinon, les .class de Cocoa se trouvent dans /System/Library/Java/. Il suffit donc d'ajouter ce chemin au classpath et tu devrais avoir accès aux classes Cocoa depuis ton programme Java.

J'espère que ça pourra t'aider.
 
Comme Moglow... à l'aveuglette (car je ne saisis pas bien ton soucis):

Package tes classes à toi dans un jar.

Ensuite -et si tu veux utiliser le principe des appli de mac os- utilise Jar bundler fourni avec le developper tools sous /Developer/Applications/Java Tools/Jar Bundler et précise la dépendance sur tes libs cocoa.

Sinon, oublie tout ça et mets le jar de tes lib cocoa dans le classpath en lançant ton appli.