Distribuer une application java ?
Je vous explique mon souci :
J'ai développé une application Java. J'en ai ensuite fait un .jar. Cette application est placée sur un disque dur accessible pour plusieurs personnes. Lorsque je lance cette application depuis mon poste, tout se passe très bien, mais lorsque je lance cette application depuis un autre poste, elle ne se lance pas, l'erreur suivante apparait à l'écran : "Could not find the main class, program will exit !" Je ne comprends vraiment pas d'où vient le problème, puisque de mon poste l'application se lance très bien, le main est trouvé sans aucun souci. Cela fait maintenant 3 jours que je suis sur ce problème, je commence vraiment à désespérer...
Est-ce que quelqu'un aurait une solution à m'apporter ?
Merci :)
Configuration: Windows 2000 Firefox 3.0.4
30 réponses
Une application Java empaquetée en jar affiche l'erreur Could not find the main class lorsque lancée depuis un autre poste, alors qu'elle démarre correctement sur le poste de développement. La cause fréquente est une hiérarchie des packages mal respectée dans le jar ou un manifest MANIFEST.MF incorrect, ce qui empêche le moteur Java de localiser la classe principale. Pour corriger, reconstruire le jar avec une structure de répertoires qui reflète les packages et inclure un Main-Class précis dans le manifest, soit par Eclipse export, soit par une commande Ant ou jar. En cas de doute, vérifier que le jar conserve une hiérarchie réelle en l’ouvrant dans un outil d’archive et en constatant que les fichiers .class apparaissent selon les paquets.
-
En effet, avec winRar on voit bien la hiérarchie ! It's crazy ! Dans ce cas là, ça voudrait dire que c'est vraiment mon MANIFEST qui n'est pas bon... Aïe aïe aïe je suis pas doué...
Bon voici mon projet :
>bin > lcl >acl >program > MainClass
>bin > lcl >acl > autres packages
> conf (contient une base de données)
> doc (contient les manuels utilisateur)
> images (comme son nom l'indique... ^^)
> lib (les librairies utilisées par l'application)
> nbproject (contient des fichiers XML et des fichiers .properties)
> src (même hiérarchie que le repertoire bin, sauf que les fichiers sont des .java)
> webPages (les pages html à afficher dans l'application)
> fichier .classpath (que j'ai modifié pour atteindre les librairies)
> fichier .project
> fichier build (en XML)
> fichier MANIFEST
Voilà quand je construis mon jar j'inclus tout ceci. Je ne vois vraiment pas où pourrait être le souci. Mystère mystère...
PS : C'est l'heure du repas de Noël ^^ A tout à l'heure j'espere :-)
Désolé pour le double post, mais le message n'apparaissait pas comme je le voulais ;) -
En effet, avec winRar on voit bien la hiérarchie ! It's crazy ! Dans ce cas là, ça voudrait dire que c'est vraiment mon MANIFEST qui n'est pas bon... Aïe aïe aïe je suis pas doué...
Bon voici mon projet :
>bin
> lcl
>acl
>program
> MainClass
> autres packages
> conf (contient une base de données)
> doc (contient les manuels utilisateur)
> images (comme son nom l'indique... ^^)
> lib (les librairies utilisées par l'application)
> nbproject (contient des fichiers XML et des fichiers .properties)
> src (même hiérarchie que le repertoire bin, sauf que les fichiers sont des .java)
> webPages (les pages html à afficher dans l'application)
> fichier .classpath (que j'ai modifié pour atteindre les librairies)
> fichier .project
> fichier build (en XML)
> fichier MANIFEST
Voilà quand je construis mon jar j'inclus tout ceci. Je ne vois vraiment pas où pourrait être le souci. Mystère mystère...
PS : C'est l'heure du repas de Noël ^^ A tout à l'heure j'espere :-) -
:tilt:
C'est peut-être ton winzip qui te fait ceci... Peut-être la hiérarchie existe bel et bien mais c'est la c*** de winzip qui ne la montre pas. Essaie:
1. ouvrir avec winrar à la place de winzip
2. extraire quelque part le contenu du fichier avec winzip ou winrar
++ -
1/ Mes sources sont dans un dossier src, et les bin dans un dossier bin ;)
2/ J'ai le jre 1.5.0_05 d'installé
3/ Yes, c'est ce que je fais :-)
J'ouvre mon jar avec WinZip, et là je vois qu'il n'y a plus aucun répertoire dans mon Jar, tout est mit directement sans aucune hiérarchie. Je vais tenter de réinstaller Eclipse... pourtant l'installation d'Eclipse correspond juste à une extraction d'archive :S
Sinon, bien trouvé la métaphore de la mouche et du fusil, j'ai aimé ^^ -
Ah, bizarre... Il y a qqchose qui cloche dans cette histoire.
1. est-ce que ton projet a les sources et les bin séparés?
2. quelle est la version de la machine virtuelle java?
3. clic droit sur le projet / Export, JAR file > Next. "Export generated class files and resources". "Compress the contents of the JAR file". > Next. "Export class files with compiles warnings" > Next. "Use existing manifesr from workspace", nothing sealed > Finish
Ceci devrait te créer un jar avec le respect de la hiérarchie. Si ce n'est pas le cas, il y a un truc dans ton installation qui n'est pas bon. Comment est-ce que tu constates que le jar n'as plus la hiérarchie (tu l'ouvres avec quoi)?
Oui, apprendre Ant juste pour créer un jar est comme si tu voulais tuer une mouche avec un fusil.
++ -
Je suis sur Eclipse 3.4.1 :-)
En ligne de commande, pareil, la hiérarchie n'est plus respectée. Je vais essayer avec Ant... mais j'ai lu sur le net que c'était une usine à gaz ^^ -
Bizarre... Je me rappelle avoir vu cette option (export to flat, ou un truc similaire) looooooooooooooongtime ago... Je ne la retrouve pas dans mon version d'Eclipse et du coup l'essai que j'ai fait conserve la hiérarchie. Quelle version d'Eclipse utilises-tu?
Oui, tu peux utiliser la ligne de commande. Ou Ant.
++ -
En effet, il n'y a plus aucune hiérarchie dans mon jar. Je pense qu'il doit y avoir une option à modifier dans Eclipse... Sinon je vais essayer de construire mon jar en ligne de commande, peut-être que cette fois la hiérarchie sera respectée
-
Re,
:-)
Alors est-ce que le fait que les lignes Class-Path et Main-Class se soient inversées peut avoir une incidence ? :S <== Je n'ai jamais testé, mais je crois que pas d'incidence.
1. La hiérarchie (les packages doivent correspondre à des répertoires dans ton jar !) est impérative, sinon ça ne marche pas (ouvre ton jar avec WinRar, par exemple, car le jar est un fichier zip)
2. N'oublie pas de mettre le point dans le classpath.
++ -
Vous êtres vraiment très patient avec moi, j'apprécie beaucoup, et je vous en remercie :-)
Alors j'ai fait les commandes DOS : Exception in thread "main" java.lang.NoClassDefFoundError: /bin/lcl/acl/program/
MainClass. Pourtant la classe Main est bien dans mon jar... je suis perdu... Par contre j'ai regardé dans mon jar, il y a toutes les classes, mais elles ne sont plus dans aucun package, serait-ce dû à ça ? Aussi j'ai repéré autre chose. Le manifest que j'ai créé est comme ceci :
Manifest-Version: 1.0
Main-Class: src.lcl.acl.program.MainClass
Class-Path: lib/forms-1.0.1.jar lib/itext-1.4.jar lib/jcommon-1.0.8.jar lib/j
freechart-1.0.3.jar lib/jxl.jar lib/looks-2.1.1.jar
Et dans le jar il est comme ceci :
Manifest-Version: 1.0
Class-Path: lib/forms-1.0.1.jar lib/itext-1.4.jar lib/jcommon-1.0.8.ja
r lib/jfreechart-1.0.3.jar lib/jxl.jar lib/looks-2.1.1.jar
Main-Class: src.lcl.acl.program.MainClass
Alors est-ce que le fait que les lignes Class-Path et Main-Class se soient inversées peut avoir une incidence ? :S -
Le main tout court (sans .java ni .class)
Fais un essai sur ton poste:
1. tu ouvres une boîte DOS
2. tu tapes
set classpath=
pour annuler la variable d'environnement classpath (si elle est définie)
3. tu exécutes ton fichier avec
java -jar nom_de_ton_jar.jar
==> cela devra s'exécuter sans problème. Si tu fais appel à d'autres bibliothèques: ou bien tu les mets dans le même dossier que ton jar contenant la classe main (le plus simple) ou bien ailleurs (mais en ce cas il faudra adapter le Class-Path dans le manifest avec des chemins relatifs).
++ -
Merci beaucoup :-)
Dernière petite question : la ligne Main-Class doit indiquer le fichier main.class ou main.java ? Je m'embrouille :S -
Sur une même ligne avec un blanc comme séparateur (pas une virgule). Fais un retour à la ligne à la colonne 78 sans te soucier si tu coupes ou pas le nom de tes bibliothèques et commence la nouvelle ligne par un blanc. Exemple de Class-Path:
Class-Path: . connector.jar com.ibm.mq.jar ojdbc14.jar jni.jar xercesImpl.jar xml-apis.jar log4j-1.2.14.jar jdom.jar jasperreports-2.0.4.jar itext-1.3.1.j ar commons-logging-api-1.0.2.jar commons-logging-1.1.jar commons-digester-1. 7.jar commons-collections-3.0.jar commons-dbcp-1.2.1.jar commons-pool-1.2.ja r jtds-1.1.jar jsiv-2.5.0.jar activation-1.1.jar commons-beanutils-1.7.0.jar commons-codec-1.3.jar commons-logging-1.1.jar jaxws-api-2.0.jar jaxen-1.1- beta-9.jar mail-1.4.jar saaj-api-1.3.jar saaj-impl-1.3.jar spring-1.2.6.jar stax-api-1.0.1.jar wsdl4j-1.6.1.jar wstx-asl-3.2.0.jar xbean-2.2.0.jar xbean -spring-2.8.jar xfire-aegis-1.2.6.jar xfire-annotations-1.2.6.jar xfire-core -1.2.6.jar xfire-java5-1.2.6.jar xfire-jaxws-1.2.6.jar xfire-spring-1.2.6.ja r xfire-jsr181-api-1.0-M1.jar XmlSchema-1.1.jar commons-httpclient-3.0.jar o rg.mortbay.jetty-5.1.3.jarxfire-jaxb2-1.2.6.jar jaxb-api-2.0.jar jaxb-impl-2 .0.1.jar jaxb-xjc-2.0.1.jar
++ -
hum hum... c'est ce qu'on appelle... une erreur de débutant ^^
j'utilise plusieurs bibliothèques, je crée plusieurs lignes Class-Path ou je met tout sur la même ligne, séparé par une virgule ? (oui désolé je suis pas très malin... ^^) -
Bon,
Il faut mettre "Main-Class", pas "Class-Main". Et éventuellement une autre ligne Class-Path avec au moins un point dedans et d'autres choses si tu fais appel à des bibliothèques tierces.Manifest-Version: 1.0 Main-Class: src.lcl.acl.program.MainClass Class-Path: .
++ -
En effet, c'est toujours l'erreur "Could not find the main class, program will exit"
Voici mon MANIFEST :
Manifest-Version: 1.0
Class-Main: src.lcl.acl.program.MainClass -
Re,
Après le rajout du manifeste dans le jar: quel message d'errur sur les autres postes? Toujours "Could not find the main class, program will exit" ? Si oui, le manifest n'est pas correct (poste-le ici, en remplaçant éventuellement les noms de ton société et ton produit par xxx / yyy s'ils apparaissent).
++ -
re :-)
Alors j'ai recréé le fichier JAR en incluant le MANIFEST, mais rien n'y fait, je suis toujours au même point... J'en ai discuté avec un collègue qui connait le sujet, et en fait apparemment c'est parce-que mon poste n'est pas compatible avec les autres... bref c'est la m**** ^^ -
ContributeurPareil!
-
Sinon je vais tenter de reconstruire le .jar en incluant le MANIFEST que j'aurais créé. Je ferais ça la semaine prochaine, l'heure du week-end approche à grands pas ^^
En tout cas merci beaucoup pour votre disponibilité :-)
Je vous tiendrais au courant de l'évolution ;)
- 1
- 2