Exemple de structure de répertoire
Test.java:2: error: package packagea does not exist
packagea contient Methods.java et commence par
package packageb; import packagea.Methods; public class Test {
packageb contient Test.java et commence par p>
package packagea; public class Methods {
Lors de la tentative de compilation de Test.java
project/sameDir1/sameDir2/packagea project/sameDir1/sameDir2/diffDirB1/diffDirB2/packageb
Quelle est la bonne façon d'importer un package Java personnalisé situé ailleurs dans votre structure du répertoire des projets?
3 Réponses :
Le nom du package doit contenir les noms de dossier à partir de la racine source (le dossier racine source est le dossier dans lequel vous exécutez la compilation ou que vous spécifiez explicitement comme racine source (javac avec l'option -sourcepath)). Dans votre cas, il peut s'agir de l'une des options suivantes:
import sameDir1.packageA;
ou
import sameDir1.sameDir1.packageA;
ou
import project.sameDir1.sameDir1.packageA;
Vous ne faites pas cela à partir de vos fichiers source java; vous le faites dans les outils qui l'entourent (donc, votre invocation java.exe
, ou la configuration de votre script de construction).
Vous avez le côté «source» et le côté «compilé». Pour les deux, il y a la règle selon laquelle la classe MyClass
dans le package mypkg1.mypkg2
doit être dans un fichier nommé MyClass.java
/ MyClass. class
*, et ce fichier doit au moins se trouver dans un répertoire nommé mypkg2
, qui doit à son tour se trouver dans un répertoire nommé mypkg1
.
Le répertoire dans lequel se trouve mypkg1
s'appelle une «racine».
Vous pouvez avoir plusieurs racines, ce n'est pas un problème, mais la tâche de spécifier les racines est pas fait à partir de votre code java .
Pour les fichiers de classe, ce travail relève de l'option classpath. Par exemple, si vous avez:
project/sameDir1/sameDir1/packageA/MyClass1.class project/sameDir1/sameDir1/diffDirB1/diffDirB2/packageB/MyClass2.class
et que vous souhaitez que MyClass1
puisse faire référence à packageB.MyClass2
et faites-le fonctionner:
java -cp project / sameDir1 / sameDir1: project / sameDir1 / sameDir1 / diffDirB1 / diffDirB2 packageA.MyClass1
et ça va fonctionne très bien.
Pour le côté source, vous pouvez également avoir des racines différentes; vous devriez utiliser un outil de construction, et aucun des outils populaires n'a de problème avec celui-ci. Les IDE, eux aussi, n'ont aucun problème avec la spécification de plusieurs racines sources; par exemple, les fichiers de test utilisent généralement une racine différente de celle du reste du projet.
*) les classes non publiques ou internes n'ont pas besoin d'être dans un fichier portant son nom; cette distinction n'est cependant pas pertinente ici.
Vous devez le faire comme suit:
Hello
et
java sameDir1.sameDir2.diffDirB1.diffDirB2.packageb.Test
Methods.java:
. âââ Methods.java âââ Test.java âââ sameDir1 âââ sameDir2 âââ diffDirB1 â  âââ diffDirB2 â  âââ packageb â  âââ Test.class âââ packagea âââ Methods.class
Test.java:
mkdir project cd project vi Methods.java vi Test.java javac -d . *.java tree
Sortie:
Hello
Notes pour la fenêtre du terminal:
package sameDir1.sameDir2.diffDirB1.diffDirB2.packageb; import sameDir1.sameDir2.packagea.Methods; public class Test { public static void main(String[] args) { Methods methods=new Methods(); methods.hello(); } }
Sortie:
package sameDir1.sameDir2.packagea; public class Methods { public void hello() { System.out.println("Hello"); } }
Suivant:
package sameDir1.sameDir2.diffDirB1.diffDirB2.packageb; import sameDir1.sameDir2.packagea.Methods; public class Test {
Sortie:
package sameDir1.sameDir2.packagea; public class Methods {
En suivant votre exemple en essayant de compiler Test.java, j'obtiens l'erreur suivante. diffDir / packageb / Test.java: 2: erreur: le package learn.packagea n'existe pas
@JosephCrandall - Il semble que vous essayez de faire tout cela à partir de la fenêtre Terminal. J'ai ajouté des notes pour la fenêtre Terminal. Faites-moi savoir en cas de problème / doute supplémentaire.
J'ai décidé que la structure de mon package était trop complexe et je l'ai simplifiée en un seul package. Merci pour le conseil.
Merci pour l'aide
veuillez écrire le dossier dans lequel vous exécutez le compilateur et la commande que vous utilisez pour compiler