Problème compilation classes package

dav79
Problème compilation classes package

Bonjour à tous,

Je suis débutant en Java. Mon problème est le suivant je souhaiterai compiler deux classes Vector et Matrice qui sont dans le package myPackage, dans des fichiers différents.

Je me positionne dans le package myPackage, je compile la classe Vector, c'est bon,

Par contre quand je veux compiler la classe Matrice, ça ne fonctionne pas, la classe Matrice a besoin de la classe Vector dans sa classe.

Exemple du code :

package myPackage;

public class Matrice
{
	protected Vector vX,vY,vZ;	// l'erreur ce produit là
	// Constructeur d'une matrice par 3 vecteurs
	public Matrice(Vector vX, Vector vY, Vector vZ)
	{
		this.vX = vX;
		this.vY = vY;
		this.vZ = vZ;
	}

Voici l'erreur :


C:\>cd j2sdk1.4.2_15

C:\j2sdk1.4.2_15>cd javaexo

C:\j2sdk1.4.2_15\javaexo>cd myPackage

C:\j2sdk1.4.2_15\javaexo\myPackage>javac Matrice.java
Matrice.java:7: cannot resolve symbol
symbol  : class Vector
location: class myPackage.Matrice
        protected Vector vX,vY,vZ;
........................................................

The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError

En faite il ne reconnait pas la classe Vector, alors qu'elle est dans le même répertoire, "myPackage", et normallement on utilise pas de import lorsque que les classes sont dans le même package

J'ai essayé aussi avec classpath dans l'option du javac, mais c'est le même problème il ne reconnait pas Vector

Comme ce ci :

C:\j2sdk1.4.2_15\javaexo\myPackage>javac -classpath C:\J2sdk1.4.2_15\bin Matrice
.java
Matrice.java:7: cannot resolve symbol
symbol  : class Vector
location: class myPackage.Matrice
        protected Vector vX,vY,vZ;
                  ^

Si quelqu'un à une solution ça serait cool, merci d'avance

dav79

fredericmazue

Quote:
la classe Matrice a besoin de la classe Vector dans sa classe

Déjà, et si tu me le permets, le nom de vector est un choix malheureux car il existe déjà un "vector officiel", dans java.util.
Sans compter les problèmes de colision de nom, tu obfusques ton code pour tout le monde (et peut être pour toit aussi). Car quand un programmeur lambda lit "vector", il comprend systématiquement java.util.Vector.

Quote:
En faite il ne reconnait pas la classe Vector, alors qu'elle est dans le même répertoire, "myPackage",

Il y a erreur de fond là, même si ça n'est pas le problème en cet instant. Répertoire n'est pas égal à package.

Quote:
normallement on utilise pas de import lorsque que les classes sont dans le même package

En effet

Quote:
'ai essayé aussi avec classpath dans l'option du javac, mais c'est le même problème il ne reconnait pas Vector

C'est pourtant bien là qu'est ton problème. A coup sûr tu t'es trompé dans le classpath.

En revanche, ce message d'erreur

Quote:
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError

Me laisse songeur je dois dire....
dav79

Merci, à toi fredericmazue, pour ta réponse,

Je suis d'accord avec toi, que les noms de mes classes ne sont pas approprié, mais ce sont justes des tests.

Si non, tu as aussi raison pour dire qu'un package n'est pas un répertoire, je me suis mal exprimé.

Maintenant tu me dit que la solution c'est d'utiliser javac -classpath, est ce que ma syntaxe est correcte d'après mon exemple, il n'ya pas d'erreur je positionne la passe sur le path c'est à dire l'adresse du répertoire bin, et normallement ça devrait fonctionner.

Donc ou est le problème.

Est apparamant la dernier message que j'ai n'est pas bon, c'est peut être la que vient le problème, apparamant ça semble un problème de mémoire, en gros

Quote:

Citation:
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError

Peut être plus précis dans ta réponse, en me donnant une réponse concrête, je te remercie pour ton aide,

dav79

fredericmazue

Quote:
mais ce sont justes des tests.

Donc une fois les tests terminés tu ré-écris tout :?: ;)

Quote:
d'après mon exemple, il n'ya pas d'erreur je positionne la passe sur le path c'est à dire l'adresse du répertoire bin,

Ah ? Ce n'est pas une erreur ça ?

Quant au java.lang.OutOfMemoryError, pour bizarre qu'il soit ce n'est pas le problème. Peut être que que compiles un très gros programme sur une toute petite machine (avec peu de mémoire). Mais même dans ce cas s'il ne trouve pas Vector la raison n'est pas là. (normalement...)

Pour toi le problème est que ta classe Vector n'est pas vue, et si elle n'est pas vue c'est qu'elle n'est pas pointée par le classpath qui soit dit en passant n'ai rien en commun ni avec le path ni avec le répertoire bin.

Donc pour t'aider concrètement je ne peux te dire qu'une chose: donne un classpath correct.

dav79

Ok fredericmazue, je viens d'avoir la solution,

On fait c'était tout bête, je n'est même pas besoin d'utiliser un classpath car les classes se trouvent dans le même package, est par défaut le classpath est positionné sur le répertoire courant, le comilateur recherche donc dans ce répertoire. Le problème ne venait pas de là.

Mais simplement au niveau de la syntaxe, voici la bonne instruction:

C:\j2sdk1.4.2_15\javaexo>javac myPackage\Matrice.java

C:\j2sdk1.4.2_15\javaexo>

Donc c'était là problème, il faut pas se positonner dans le package. mais seulement dans le répertoire racine, "javaexo" puise ensuite quand utilise l'instruction javac pour compiler les classes il faut donner le chemin relatif de la classe du package "myPackage"

Et ça marche.

En tout cas merci pour ton aide,

dav79

fredericmazue

Quote:
par défaut le classpath est positionné sur le répertoire courant,

Ben non...
Ca dépend des JVM et de la plate-forme.

En général (je dis bien en général) le répertoire courant est intégré dans le classpath sous Windows, mais pas sous Linux.

Quote:
l faut pas se positonner dans le package. mais seulement dans le répertoire racine,

Ce qui revient à un problème de classpath, ni plus ni moins.

C'est vrai que j'aurais pu voir que tu n'étais pas positioné à la racine. Mais ton "répertoire bin" m'a hypnotisé. :lol:

Mais si tu me le permets, je pense que tu n'as pas parfaitement saisi la chose dans toute sa finesse.
Fondamentalement le problème n'est pas le répertoire où tu te situes avant de lancer javac. Le problème est que Vector doit être compilée avant la classe qui l'utilise (ce que tu fais bien) **puis doit être placée** dans le sous répertoire myPackage d'un endroit quelconque faisant partie du classpath.

Dans ton cas, tu t'en sors parce que tu compiles tout au même endroit et que tu déposes les .java et les .class dans le même répertoire.
Mais dès que tu vas travailler avec un projet plus complexe, avec de nombreux packages et répertoires, tu verras que tu vas retomber sur le problème.
Donc je me permets d'insister. Tu dois:

- positionner un classpath correct, qui est pour, reprendre tes termes, une collection (et non un seul) de répertoires racines.

- faire en sorte que les classes compilées, c'est à dire les fichiers .class, soient positionnées sous une quelconque de ces racines, *et* dans un sous -répertoire de même nom que le package.

D'ailleurs si ça t'amuse de regarder, tous les environnements de programmation Java tels Eclipse, Netbeans ou autre séparent (ou permettent de séparer) .java et .class et fonctionnent comme je te l'ai dit.

En espérant avoir été bien clair... :)