2012-01-23 6 views
2

tout le monde.sur le paramètre classpath de Java sur Linux

J'ai utilisé openjdk-7 sur arch linux. J'ai commencé à apprendre Java récemment, et rencontré un tel problème:

J'ai créé un fichier à /home/hqwrong/Code/java/mew/Mouth.java:

package mew; 

public class Mouth{ 
    public static void main(String argv[]){ 
     pickle.Say s = new pickle.Say(); 
    } 
} 

et un autre à/home /hqwrong/Code/java/pickle/Say.java:

package pickle; 

public class Say{ 
    public Say(){ 
     System.out.println("Say"); 
    } 
} 

Je compilé Say.java à Say.class, en utilisant:

$ cd /home/hqwrong/Code/java/pickle 
$ javac Say.java 

qui i s réussi.

Je compilé Mouth.java, en utilisant:

$ cd ../mew 
$ export CLASSPATH=.:/home/hqwrong/Code/java/ 
$ javac Say.java 

aucun message d'erreur.

Mais après type:

$ java Say

Je suis:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.mew 
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:649) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:785) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:472) 

Il est même quand je l'utilise:

$ java -cp $CLASSPATH Say 

J'ai besoin de votre aide, s'il vous plaît?

+1

Est-ce que vous montrez le code tel quel ou vous l'avez modifié pour cette question? Je soupçonne que dans votre code, vous pourriez avoir 'package java.mew '? – Vadim

+0

@anubhava sa valeur initiale est rien, je ne sais pas pourquoi il compile et fonctionne avec succès jusqu'à ce que j'ai fait ce paquet-test, Peut-être qu'il connaît le chemin du système jdk lib par une autre voie. –

+0

@laixer oui, c'est l'original.J'apprends java, ceci est mon code pour apprendre la fonctionnalité du paquet de Java. Il échoue également, après avoir modifié le paquetage java.mew. –

Répondre

7

Comme il n'y a pas de bonne réponse encore, je posterai la mienne. D'abord, vous devriez vraiment avoir un dossier séparé pour vos classes et vos sources. Je suggère d'utiliser java/src pour vos sources, et java/classes pour vos classes. Puisque les classes sont stockées dans le dossier classes, c'est celui qui devrait être dans le classpath.

L'arborescence de vos sources doit alors correspondre à votre arborescence de packages. Cela signifie que la classe mew.Mouth doit contenir la ligne package mew, être définie dans le fichier Mouth.java, dans le dossier java/src/mew.

Pour compiler vos classes, vous mettez dans le répertoire java/src, et utilisez la commande suivante:

javac -d ../classes mew/Mouth.java pickle/Say.java 

Le compilateur génère automatiquement la structure de dossiers correspondant à la structure du package dans le répertoire des classes. Si vous faites des modifications structurelles dans votre arborescence source, supprimez simplement tout dans le dossier classes et recompilez tout.

Pour exécuter vos cours, vous devez vous référer à leur nom complet.Et le dossier contenant votre arborescence de package (le dossier java/classes) doit être dans le classpath. Une fois cela fait, de partout, vous pouvez utiliser

java mew.Mouth 

Notez que, comme vous l'avez découvert, les java et javax paquets sont réservés. Vous ne pouvez pas les utiliser pour vos propres cours.

+0

+1 Ceci est la vraie réponse. – MockerTim

+0

Cette réponse m'a également aidé. Merci beaucoup! ^. ^ – dotslash

1

S'il vous plaît essayer,

ouvrir votre dossier racine, Aller à la vue tick Menu &, afficher les fichiers cachés. Maintenant, il affichera un fichier appelé ".bashrc". ouvrir ce fichier & écrire des lignes de code suivantes,

PATH=$PATH:/opt/jdk1.6.0_21/bin 
export PATH 
JAVA_HOME=/opt/jdk1.6.0_21 
export JAVA_HOME 
+0

Merci pour votre réponse. Mais je pense que la réponse est que j'ai tapé un mauvais nom de classe comme l'a dit MockerTim. –

+0

thats ok, ceci est pour les paramètres de classpath comme décrit le titre de votre question. – Android

+0

pouvez-vous s'il vous plaît au moins voteup ma réponse afin qu'il puisse être utile pour les autres – Android