# [java] Jar externe et classLoader



## mpergand (14 Juillet 2005)

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 (15 Juillet 2005)

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 :


```
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 (15 Juillet 2005)

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 (16 Juillet 2005)

Il semble que rajouter:
Class-Path: com.apple.cocoa.foundation
au fichier manifest résolve le problème.

Merci à tous.


----------

