Java не компилирует файлы .class в $ CLASSPATH - PullRequest
4 голосов
/ 26 января 2010

Я пытаюсь понять, как организовать исходные файлы и файлы классов при работе с пакетами. Я нашел очень полезный учебник . Но у меня все еще есть некоторые вопросы.

Насколько я понял, хорошей практикой является наличие изоморфизма между именами пакетов и именами каталогов, в которых хранятся элементы пакета. Например, если у меня есть пакет с именем aaa.bbb.ccc, который содержит класс ddd, рекомендуется иметь файл класса с именем "ddd.class", расположенный в "$ CLASSPATH / aaa / bbb / ccc /". Я правильно понял?

Если это так, будет ли компилятор Java автоматически помещать файлы * .class в правильный каталог?

Я не смог получить такое поведение. Я установил для переменной $CLASSPATH значение "/home/myname/java/classes". Я выполнил javac KeyEventDemo.java, который содержит package events;. Я ожидал, что javac создаст подкаталог events в /home/myname/java/classes и поместит KeyEventDemo.class в этот подкаталог.

Этого не произошло. Я попытался помочь javac и создал подкаталог «events» сам. Я снова использовал javac, но он не хочет помещать файлы классов в "/ home / myname / java / classes / events". Что я делаю не так?

Ответы [ 3 ]

6 голосов
/ 26 января 2010

Вам нужно использовать опцию -d, чтобы указать, где вы хотите получить файлы .class. Просто укажите базовый каталог; javac создаст все каталоги, необходимые для соответствия нужному пакету.

Пример (на основе вашего вопроса):

javac -d ~/java/classes KeyEventDemo.java
4 голосов
/ 26 января 2010

Например, если у меня есть пакет с именем «aaa.bbb.ccc», который содержит класс "DDD" это хорошая практика, чтобы иметь файл класса с именем "ddd.class" и находится в "$ CLASSPATH / aaa / bbb / ccc /". Я правильно понял?

Это не «хорошая практика» - это то, как Sun JDK ожидает, что вещи будут. Иначе это не сработает. Теоретически, другие реализации Java могут работать по-другому, но я не знаю, что делать.

Если это так, будет ли компилятор Java поместите * .class файл в правильный каталог автоматически?

Да

Что я делаю не так?

Исходный код должен также уже следовать этой структуре, т.е. KeyEventDemo.java должен находиться в подкаталоге с именем «events». Затем вы делаете «события javac / KeyEventDemo.java», и это должно работать.

2 голосов
/ 26 января 2010

Это не только хорошая практика, но обязательно в большинстве случаев.

рассмотрим класс Java с именем:

com.example.Hello

Если вы храните его в файловой системе, он должен получить

/path/to/my/classes/com/example/Hello.java

Компилятор (или, по крайней мере, подавляющее большинство) создаст файл класса в

/path/to/my/classes/com/example/Hello.class

Лично я бы не использовал переменную CLASSPATH для установки пути, но параметр -cp на Java. Вызов вышеуказанного «приложения» может быть сделан с помощью:

java -cp /path/to/my/classes com.example.Hello
...