о настройке пути к классам Java в Linux - PullRequest
2 голосов
/ 23 января 2012

каждый.

Я использовал openjdk-7 на Arch Linux. Я недавно начал изучать Java и столкнулся с такой проблемой:

Я создал файл в /home/hqwrong/Code/java/mew/Mouth.java:

package mew;

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

и еще один в /home/hqwrong/Code/java/pickle/Say.java:

package pickle;

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

Я скомпилировал Say.java в Say.class, используя:

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

, что успешно.

Я скомпилировал Mouth.java, используя:

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

сообщение об ошибке отсутствует.

Но после того, как я наберу:

$ java Say

Я получил:

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)

То же самое, когда я использую:

$ java -cp $CLASSPATH Say

Мне нужна ваша помощь, пожалуйста?

Ответы [ 2 ]

7 голосов
/ 23 января 2012

Поскольку пока нет хорошего ответа, я опубликую свой.

Во-первых, у вас должна быть отдельная папка для ваших классов и ваших источников.Я предлагаю использовать java/src для ваших источников и java/classes для ваших классов.Поскольку классы хранятся в папке классов, именно она должна находиться в пути к классам.

Дерево папок ваших источников должно соответствовать дереву ваших пакетов.Это означает, что класс mew.Mouth должен содержать строку package mew, определенную в файле Mouth.java, в папке java/src/mew.

Чтобы скомпилировать ваши классы, поместите вас в java/srcи используйте следующую команду:

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

Компилятор автоматически сгенерирует структуру папок, соответствующую структуре пакета в каталоге классов.Если вы делаете структурные изменения в своем исходном дереве, просто удалите все в папке классов и перекомпилируйте все.

Чтобы запустить ваши классы, вы должны обратиться к их полностью определенному имени.И папка, содержащая ваше дерево пакетов (папка java/classes), должна быть в classpath.Как только это будет сделано, вы можете использовать

java mew.Mouth

везде, как вы обнаружили, пакеты java и javax зарезервированы.Вы не можете использовать их для своих собственных классов.

0 голосов
/ 23 января 2012

Пожалуйста, попробуйте это,

откройте вашу корневую папку, перейдите в меню и отметьте галочкой, просмотрите скрытые файлы. Теперь он будет отображать файл с именем ".bashrc". откройте этот файл и запишите следующие строки кода,

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