• Bonjour Visiteur. Bienvenue sur les nouveaux forums de MacGeneration. La peinture est encore fraiche, quelques boulons doivent être resserrés, plus d’informations demain !

[java] Jar externe et classLoader

mpergand

Membre confirmé
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 !
 

molgow

Vétéran
Club MacG
4 Janvier 2002
5 493
612
36
Suisse
www.monts-chevreuils.ch
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.
 

GrandGibus

Membre d’élite
Club MacG
8 Mars 2004
1 262
103
45
Bordeaux
homepage.mac.com
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.
 

mpergand

Membre confirmé
10 Novembre 2003
220
18
Il semble que rajouter:
Class-Path: com.apple.cocoa.foundation
au fichier manifest résolve le problème.

Merci à tous.