2010-01-26 2 views
4

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

Насколько я понял, хорошей практикой является изоморфизм между именами пакетов и именем каталогов, в которых хранятся элементы пакета. Например, если у меня есть пакет с именем 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». Что я делаю не так?

ответ

6

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

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

javac -d ~/java/classes KeyEventDemo.java 
+3

И уточнить $ CLASSPATH: он расскажет JVM, где искать классы во время выполнения, а не сообщать javac, где создавать классы, этот ответ и ваш опыт показывают. –

2

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

рассмотрим класс 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 
4

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

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

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

Да

Что я делаю неправильно?

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

+0

Если вы используете опцию '-d' (настоятельно рекомендуется, чтобы двоичные файлы находились в другом месте от источника), теоретически ваш источник не должен следовать этой иерархии. –

+0

На java.sun.com я обнаружил, что удобно хранить * java и * файлы классов в разных каталогах. И я хотел бы использовать этот подход. – Roman

+0

Как писал Крис, вы можете использовать для этого параметр -d. Но по-прежнему очень хорошая идея сохранить исходные файлы в одной и той же иерархии каталогов, или это будет очень запутанным. –

Смежные вопросы