1
votes

Quelle est la bonne façon d'importer un package Java personnalisé situé ailleurs dans la structure de répertoires de vos projets?

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?


1 commentaires

veuillez écrire le dossier dans lequel vous exécutez le compilateur et la commande que vous utilisez pour compiler


3 Réponses :


0
votes

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;


0 commentaires

0
votes

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.


0 commentaires

0
votes

Vous devez le faire comme suit:

Hello

et

java sameDir1.sameDir2.diffDirB1.diffDirB2.packageb.Test

Démo:

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 {


4 commentaires

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