#1 Le 08/01/2008, à 11:55
- littleblackdog
[~résolu][newbie] Pas facile de faire sans Eclipse en java ...
Salut, et bonne année à tous.
Cherchant à faire un petit programme de reconnaissance de caractères dans une image fonctionnant sous Ubuntu, et ayant décidé pour une fois et pour le sport de faire sans Eclipse, je rencontre un petit problème.
J'ai dans mon répertoire <X>/fr/unistra/pelican/algorithms/experimental deux fichiers contenant chacun une classe du même nom : Symmetry.java et Demonstration.java (Demonstration contient le main).
Ces deux classes sont membres d'un même package : fr/unistra/pelican/algorithms/experimental.
Elles utilisent d'autres classes présentes dans une archive pelican.jar présentes dans le répertoire <X>, lesquelles classes ont à leur tour besoin d'autres JARs pour fonctionner, ces .jars secondaires se trouvant dans <X>/lib. J'ai donc exporté dans mon fichier .bashrc : la variable CLASSPATH listant le répertoire <X>, le répertoire <X>/lib et le répertoire contenant Symmetry.java et Demonstration.java.
Mon makefile est le suivant :
#Demonstration.class: Demonstration.java Symmetry.class
# javac -g Demonstration.java
#
#Symmetry.class: Symmetry.java
# javac -g Symmetry.java
#
#clean:
# rm -rf *.class
La compilation avec make se passe bien, par contre lorsque je me trouve dans le répertoire X et que j'entre la commande "java Demonstration", il m'est répondu :
Exception in thread "main" java.lang.NoClassDefFoundError: Demonstration (wrong name: fr/unistra/pelican/algorithms/experimental/Demonstration)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
..et je ne comprends pas pourquoi.
Etant donné que dans Eclipse, je faisais un "Add External JARs" de chacun des JARs intervenant dans mon projet, que je n'ai pas modifié le contenu de Symmetry.java et Demonstration.java et que ça fonctionnait, je dois vraiment être passé à coté de quelque chose ...
Quelqu'un saurait d'o๠vient le problème ?
Merci d'avance !
Dernière modification par littleblackdog (Le 10/01/2008, à 16:12)
Hors ligne
#2 Le 08/01/2008, à 12:49
- Martopioche
Re : [~résolu][newbie] Pas facile de faire sans Eclipse en java ...
Bonjour,
Bon, dans un premier temps, je serai bien tenté de te demander si tu était au courant que le monde avait évolué depuis le make ? Essaye donc un peu ant, tu va voir, ça change la vie. Bon, je parle pas de Maven, faut évoluer dans l'ordre
Bon, sinon, heu... ca semble etre l'erreur classique de déclaration d'un classpath... Tu est sûr que tes .class sont générés dans les répertoires déclarés dans le Classpath ? Et qu'ils sont présents ?
Essaye pour te refaire la main un simple helloworld dans un package, déclarer le classpath vers ce parckage puis java helloworld. Tu verra si tu a raté ta déclaration ou si ce peut etre les dépendances.
Voila voila.
Hors ligne
#3 Le 08/01/2008, à 22:04
- littleblackdog
Re : [~résolu][newbie] Pas facile de faire sans Eclipse en java ...
merci de tes conseils, Martopioche.
Effectivement, je ne connaissais pas ant et vais voir ce que c'est. Je me méfie des outils qui font plein de choses, car ils ont souvent le double désavantage de faire de moi un assisté (hors en ce qui concerne le java, je préfèrerais maà®triser les concepts en ensuite me faciliter la tà¢che) et de demander de la ressource. Or je veux simplement comprendre comment se passent les choses en java, car il est vrai que même si j'ai déjà programmé en ce langage, je n'ai jamais eu à faire de package ou à utiliser de JARs.
Bon, sinon, heu... ca semble etre l'erreur classique de déclaration d'un classpath... Tu est sûr que tes .class sont générés dans les répertoires déclarés dans le Classpath ? Et qu'ils sont présents ?
oui.
Peut-être que le souci vient du fait que je n'ai pas décompacté les JARs ? j'ai pourtant lu que si un .jar se trouve dans le classpath, il était interprété comme une arborescence normale ...
Dernière modification par littleblackdog (Le 08/01/2008, à 22:06)
Hors ligne
#4 Le 10/01/2008, à 16:10
- littleblackdog
Re : [~résolu][newbie] Pas facile de faire sans Eclipse en java ...
bon ben, j'ai essayé ant et, après une courte adaptation, et en étant loin d'avoir compris tout ce qu'il est possible de faire avec, je dois avouer que c'est pas mal même si, en ce qui me concerne, je suis encore aujourd'hui plus à l'aise avec makefile et n'ai pas besoin d'autre chose.
pour ceux que ça intéresse et qui comme moi ne connaissaient pas, vous pouvez aller par ici. et ant est apparemment installé de base sur Ubuntu.
par contre, après avoir fait mon premier build.xml, j'avais exactement le même problème.
je l'ai résolu compilées aussi bien avec ant ou make :
en fait, je me suis rendu dans mon répertoire <X>/fr/unistra/pelican/algorithms/experimental/ et ai entré non pas "java Demonstration" comme je le faisais avant, mais ce qu'il me proposait, à savoir "java fr/unistra/pelican/algorithms/experimental/Demonstration" .
quand à pourquoi il faut faire ça, cela reste un mystère pour moi, car j'ai bien la ligne ..
export CLASSPATH=<X>/fr/unistra/pelican/algorithms/experimental/:$CLASSPATH
..dans mon .bashrc, en ayant relancé la console, et tout ce que j'ai imaginé.
si quelqu'un peut m'apporter une réponse, je lui en serai gré. sinon .. tant pis.
à une autre fois !
Dernière modification par littleblackdog (Le 10/01/2008, à 16:16)
Hors ligne