[Java] Problème de classpath avec un fichier Jar

Problème de classpath avec un fichier Jar [Java] - Java - Programmation

Marsh Posté le 14-09-2003 à 00:21:02    

Bonsoir,
 
Je ne parviens pas à utiliser correctement l'attribut Class-Path du fichier Manifest d'un Jar.
Dans ce Jar, j'ai deux fichiers :

Citation :

classes/Hello.class
META-INF/MANIFEST.MF


 
La classe Hello affiche le classique Hello World, tandis que le fichier Manifest contient les lignes suivantes :

Citation :

Manifest-Version: 1.0
Main-Class: Hello
Class-Path: classes


 
J'ai une exception java.lang.NoClassDefFoundError en tentant d'utiliser ce Jar. Où est le problème ?! :??:
 
Mon environnement dans le cas où :
Windows XP
Java SDK 1.4.1


Message édité par Krueger le 14-09-2003 à 00:26:39

---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 14-09-2003 à 00:21:02   

Reply

Marsh Posté le 14-09-2003 à 08:55:11    

Krueger a écrit :

Bonsoir,
 
Je ne parviens pas à utiliser correctement l'attribut Class-Path du fichier Manifest d'un Jar.
Dans ce Jar, j'ai deux fichiers :

Citation :

classes/Hello.class
META-INF/MANIFEST.MF


 
La classe Hello affiche le classique Hello World, tandis que le fichier Manifest contient les lignes suivantes :

Citation :

Manifest-Version: 1.0
Main-Class: Hello
Class-Path: classes


 
J'ai une exception java.lang.NoClassDefFoundError en tentant d'utiliser ce Jar. Où est le problème ?! :??:
 


 
 
2 choses
 
1.
dans un jar tu dois avoir tes packages dans la racine et un répertoire Meta-inf dans lequel tu as (entre autres) un fichier Manifest.mf
 
Ce qui veut dire que dans ton cas classes serait le package de ta classe Hello. Donc ton jar est mal construit Hello.class devrait se trouver dans le root de ton jar et pas besoin du tag Class-Path: dans ton manifest
 
2.
Le tag Class-Path dans un jar est utilisé pour donner accès à des classes ou des jars externes au jar concerné. Exemple, j'ai un jar monprojet.jar qui a besoin des librairies mail.jar activation.jar -> dans son manifest  

Code :
  1. Class-Path: mail.jar activation.jar


 

Reply

Marsh Posté le 14-09-2003 à 10:48:16    

donne plutot la structure de ton jar et la ligne de commande que tu tapes pour le lancer C'est dans un de ces 2 trucs qu'il y a le problème


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 14-09-2003 à 12:16:56    

ozark74 a écrit :

1.
dans un jar tu dois avoir tes packages dans la racine et un répertoire Meta-inf dans lequel tu as (entre autres) un fichier Manifest.mf


Le vrai fichier Jar que je souhaitais générer est une application contenant entre autres des ressources et des librairies. Alors j'avais jugé logique d'organiser un peu le tout, par exemple :
- les classes dans classes
- les librairies (Jar) dans lib
- les données dans data
Néanmoins j'ignore s'il y a une convention ou autre recommendation quant à leur localisation.
 

ozark74 a écrit :

2.
Le tag Class-Path dans un jar est utilisé pour donner accès à des classes ou des jars externes au jar concerné. Exemple, j'ai un jar monprojet.jar qui a besoin des librairies mail.jar activation.jar -> dans son manifest  

Code :
  1. Class-Path: mail.jar activation.jar



Ça ne marche pas pour les classes qui ne sont pas dans un Jar avant archivage (dans mon cas la classe Hello) ?
 

benou a écrit :

donne plutot la structure de ton jar et la ligne de commande que tu tapes pour le lancer C'est dans un de ces 2 trucs qu'il y a le problème


Mon Jar contient les deux fichiers que j'avais cité ci-dessus dans l'arborescence indiquée. Pour lancer mon Jar, j'utilise simplement java -jar my_jar.jar.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 14-09-2003 à 12:31:19    

Bon, j'avais créé mon Jar en le zippant au début. :whistle:  Maintenant, si je le crée avec l'utilitaire jar, j'ai toujours la même erreur :

Citation :

F:\Data\Java\jar>jar cvfm my_jar.jar META-INF\MANIFEST.MF classes
manifest ajouté
ajout : classes/(entrée = 0) (sortie = 0)(0% stocké)
ajout : classes/Hello.class(entrée = 417) (sortie = 286)(31% compressés)
ajout : classes/Hello.java(entrée = 120) (sortie = 104)(13% compressés)
 
F:\Data\Java\jar>java -jar my_jar.jar
Exception in thread "main" java.lang.NoClassDefFoundError: Hello


 
L'arborescence du Jar est identique et le contenu de son Manifest est le suivant :

Citation :

Manifest-Version: 1.0
Class-Path: classes
Created-By: 1.4.1_02 (Sun Microsystems Inc.)
Main-Class: Hello
 


Message édité par Krueger le 14-09-2003 à 12:49:53

---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 14-09-2003 à 19:44:09    

Krueger a écrit :

Le vrai fichier Jar que je souhaitais générer est une application contenant entre autres des ressources et des librairies. Alors j'avais jugé logique d'organiser un peu le tout, par exemple :
- les classes dans classes
- les librairies (Jar) dans lib
- les données dans data
Néanmoins j'ignore s'il y a une convention ou autre recommendation quant à leur localisation.


ben ca marche pas comme ca un jar.
un jar ca contient que des classes (et éventuellement des fichiers de données) et elles doivent se trouver à la racine.
 
Tu peux pas inclure d'autres jar dans ton jar


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 14-09-2003 à 20:30:31    

benou a écrit :


ben ca marche pas comme ca un jar.
un jar ca contient que des classes (et éventuellement des fichiers de données) et elles doivent se trouver à la racine.
 
Tu peux pas inclure d'autres jar dans ton jar


 
Benou à raison. Ce que tu cherches c'est pas un ear par hasard?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 14-09-2003 à 21:55:56    

Non, non. C'était bien un jar. Alors je vais suivre vos recommandations. :jap: Après tout, j'ai fait quelques tests et il me semble bien que l'attribut Class-Path du Manifest ne prenne en compte rien d'autre que des jars. Merci encore.
 

benou a écrit :

Tu peux pas inclure d'autres jar dans ton jar


:heink:
Que veux-tu dire par là ? Je viens de faire un jar qui contient d'autres jars et j'ai réussi à les utiliser. :??:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 14-09-2003 à 23:06:37    

Krueger a écrit :


Que veux-tu dire par là ? Je viens de faire un jar qui contient d'autres jars et j'ai réussi à les utiliser. :??:


???
 
que veux tu dire par les utiliser ??? Les classes inclues dans ton jar arrivaient à se servir des jar inclus dans ton jar ?  :heink:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 15-09-2003 à 09:05:51    

Krueger a écrit :

Non, non. C'était bien un jar. Alors je vais suivre vos recommandations. :jap: Après tout, j'ai fait quelques tests et il me semble bien que l'attribut Class-Path du Manifest ne prenne en compte rien d'autre que des jars. Merci encore.
 
 
:heink:
Que veux-tu dire par là ? Je viens de faire un jar qui contient d'autres jars et j'ai réussi à les utiliser. :??:


 
tu viens de faire un jar qui référence d'autre jar externe via le manifest et là ca a marché, nuance :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 09:05:51   

Reply

Marsh Posté le 15-09-2003 à 09:27:23    

DarkLord a écrit :


 
tu viens de faire un jar qui référence d'autre jar externe via le manifest et là ca a marché, nuance :o


 
:non:
Ce sont bien des Jars internes à ma propre archive Jar.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 09:32:54    

Krueger a écrit :


 
:non:
Ce sont bien des Jars internes à ma propre archive Jar.


 
 :heink:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 10:42:01    


Le Jar que j'ai testé contient les fichiers suivants :

Citation :


Hello.class
lib/hsqldb.jar
lib/saxon.jar
WEB-INF/MANIFEST.MF


 
Classe Hello :

Code :
  1. public class Hello
  2. {
  3.   public static void main(String[] args) throws Exception
  4.   {
  5.     System.out.println("Hello world !" );
  6.     System.out.println(Class.forName("org.hsqldb.jdbcDriver" ));
  7.     System.out.println(Class.forName("com.icl.saxon.StyleSheet" ));
  8.   }
  9. }


 
Fichier Manifest :

Citation :

Manifest-Version: 1.0
Class-Path: . lib/hsqldb.jar lib/saxon.jar
Created-By: 1.4.1_03 (Sun Microsystems Inc.)
Main-Class: Hello
 


 
Résultat de l'exécution :

Citation :

E:\login\java\jar>java -jar my_jar.jar
Hello world !
class org.hsqldb.jdbcDriver
class com.icl.saxon.StyleSheet


 
Donc... ça marche ! Alors pourquoi un :heink: ? Ou alors j'ai mal compris ce qu'on voulait me dire. :/


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 10:52:30    

bin c'est ce que je dis t'as foutu un classpath spécifique dans ton manifest :o
 
mettre un jar dans un autre jar comme ca ne marche pas :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 11:02:59    

Pourquoi je ne devrais pas mettre un Classpath spécifique dans mon jar ? C'est pour une application intégrée dans un Jar, alors ça serait un peu le bordel si le client devait gérer plusieurs Jars. Remarque qu'il me suffirait en fait de décompresser les Jars intégrés avant de les réintégrer. :sarcastic:
 
Sinon, j'ai créé un Jar pour mon application et en effet, le chargement d'une classe dans un Jar plante. Pourtant ça avait marché pour my_jar.jar. :??:
edit et réponse : Je me trouvais dans le répertoire où j'ai créé l'archive, donc DMC. :D


Message édité par Krueger le 15-09-2003 à 11:12:36

---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 11:13:13    

Krueger a écrit :

Remarque qu'il me suffirait en fait de décompresser les Jars intégrés avant de les réintégrer. :sarcastic:


 
sauf que certaines licenses interdisent ce genre de choses :sarcastic:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 11:26:22    

DarkLord a écrit :

bin c'est ce que je dis t'as foutu un classpath spécifique dans ton manifest :o


tu savais que ca pouvait marcher ce truc ? mettre un jar dans le un jar et l'indiquer dans le classpath du manifest ???
 
ca métonne ce truc  :heink:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 15-09-2003 à 11:33:58    

benou a écrit :


tu savais que ca pouvait marcher ce truc ? mettre un jar dans le un jar et l'indiquer dans le classpath du manifest ???
 
ca métonne ce truc  :heink:  


 
Disons que dans un EAR par exemple c'est tout à fait possible. Or un ear c'est jamais qu'un JAR avec une extension .ear
 
Euh ...  :pt1cable:  
 
ah bin non rien à voir parce que c'est comme ca
 
monapp.ear
   - lib
      toto.jar
   tutu.jar
 
et dans tutu.jar j'ai
 
Classpath: lib/toto.jar
 
et là ca marche mais dans le jar lui meme, non ca m'étonne :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 11:41:45    

DarkLord a écrit :


 
monapp.ear
   - lib
      toto.jar
   tutu.jar
 
et dans tutu.jar j'ai
 
Classpath: lib/toto.jar
 
et là ca marche mais dans le jar lui meme, non ca m'étonne :)


 
 
pareil

Reply

Marsh Posté le 15-09-2003 à 12:20:32    

[:blueflag] je lirai plus tard :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-09-2003 à 12:52:43    

DarkLord a écrit :


 
Disons que dans un EAR par exemple c'est tout à fait possible. Or un ear c'est jamais qu'un JAR avec une extension .ear
 
Euh ...  :pt1cable:  
 
ah bin non rien à voir parce que c'est comme ca
 
monapp.ear
   - lib
      toto.jar
   tutu.jar
 
et dans tutu.jar j'ai
 
Classpath: lib/toto.jar
 
et là ca marche mais dans le jar lui meme, non ca m'étonne :)


 
Non non, il n'y a plus à s'étonner. Relisez mon DMC. :D Il y avait un répertoire lib de là où j'avais lancé mon Jar, alors forcément ça a été un peu facile du coup. :whistle:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 12:55:15    

DarkLord a écrit :


 
sauf que certaines licenses interdisent ce genre de choses :sarcastic:


J'y pensais justement. Y a-t-il modification des binaires dès qu'on déJarre une archive ?


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 14:03:06    

Krueger a écrit :


Non non, il n'y a plus à s'étonner. Relisez mon DMC. :D Il y avait un répertoire lib de là où j'avais lancé mon Jar, alors forcément ça a été un peu facile du coup. :whistle:


je me disais aussi :)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 15-09-2003 à 15:16:27    

Krueger a écrit :


 
Non non, il n'y a plus à s'étonner. Relisez mon DMC. :D Il y avait un répertoire lib de là où j'avais lancé mon Jar, alors forcément ça a été un peu facile du coup. :whistle:


 
Le Jar que j'ai testé contient les fichiers suivants :

Citation :


Hello.class
lib/hsqldb.jar
lib/saxon.jar
WEB-INF/MANIFEST.MF


 
 
:sarcastic:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-09-2003 à 15:24:16    

Je parlais du répertoire lib avant création de l'archive. :sarcastic:


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 15-09-2003 à 15:32:03    

ah bin bravo :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed