-
Problème de classpath
Bonjour,
Je cherche à executer un programme qui pète durant l'execution avec un noClassDefFound error. Ceci pour la classe javax.media.jai.PlanarImage alors que je l'ajoute bien au classpath (la classe est ds la lib jai_core.jar) (cf. ci dessous)
Code:
java -cp ".;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\jai_codec.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\jai_core.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\jutf7-0.9.0.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunpkcs11.jar" -jar fr.intuitiv.tesseract.ocr-0.0.1-SNAPSHOT-jar-with-dependencies.jar C:\intuitiv\tesseract-ocr C:\intuitiv\tesseract-input edf
Une idée pourquoi cette erreur ? :roll:
-
Pour faire simple, quand tu utilises un jar exécutable, l'option -cp est désactivée.
Accessoirement ajouter des jars dans le répertoire \lib\ext de ta JRE est une mauvaise idée, en effet cela risque de créer des conflits potentiels avec d'autres application java qui utiliseraient.
La bonne façon de procéder est la suivante.
Au niveau de ton application tu crées un répertoire lib dans lequel tu vas mettre l'ensemble des jars dont ton projet dépend (dnsns, jai_core et compagnie).
Puis tu modifies le fichier MANIFEST.MF contenu dans le répertoire META_INF de ton jar exécutable en lui ajoutant la référence des jar dont tu dépends, par exemple
Code:
Class-Path: dnsns.jar jai_core.jar
De fait tu devras te retrouver avec dans un répetoire:
.../fr.intuitiv.tesseract.ocr-0.0.1-SNAPSHOT-jar-with-dependencies.jar
.../lib/dnsns.jar
.../lib/jai_core.jar
et ainsi de suite.
Dans ce cas il te suffira de faire un
Code:
java-jar fr.intuitiv.tesseract.ocr-0.0.1-SNAPSHOT-jar-with-dependencies.jar C:\intuitiv\tesseract-ocr C:\intuitiv\tesseract-input edf
-
Nickel !
Merci pour cette réponse du tonnerre.
Petite chose : le dossier .../lib/... est une "convention" java ?
et si je veux stocker mes lib dans un autre dossier, comment fait-on ?
au lieu de Class-Path: jai-core.jar il faut mettre mon_classpath:jai_core.jar non ?
Merci.
-
Class-Path: dans le manifest.mf prend des fichier relatifs à l'emplacement du jar, tu peux donc les mettre ou tu veux tant que le chemin colle avec ce que tu met dans le manifest.mf. Le répertoire lib est plus une habitude qu'une convention, et n'est entout cas pas spécifié par java.
-
Le lib est juste une convention, mais absolument pas quelque chose d'obligatoire en JavaSE (en ce qui concerne les WAR, c'est potentiellement plus obligatoire, enfin dans le cadre d'un WAR autonome, pour les projets EE ça se passe encore autrement).
En fait convention signifie juste pratique habituelle, mais n'implique absolument pas d'obligation.
Tu pourrais l'appeler trucmachin, ce serait la même chose à partir du moment ou tu référencie trucmachin au lieu de lib dans ton manifest.