Как указать для javac, куда должны идти скомпилированные классы? - PullRequest
3 голосов
/ 21 марта 2010

Я компилирую свой исходный файл так:

/home/bob/java/jdk1.5.0_06/bin/javac /home/bob/output/a.java

Как мне изменить эту командную строку, чтобы сгенерировать файл класса в /home/bob/class?

Кроме того, как для этого должны быть установлены переменные среды (например, JAVA_HOME, CLASSPATH, JAVAPATH)?

Ответы [ 3 ]

6 голосов
/ 21 марта 2010

Есть несколько способов получить javac для создания файла класса /home/bob/class/a.class.

Есть два компонента, которые взаимодействуют, чтобы определить, где будет сгенерирован вывод javac:

Значение «каталога назначения», которое задается параметром -d.

Пакет, к которому принадлежит класс, определенный в a.java. Это устанавливается оператором пакета в вашем исходном файле Java.

Вот таблица возможных значений, которая даст вам результаты, которые вы ищете, с некоторыми примечаниями о них

destination directory (-d) |  package declaration |           comments
 /home/bob/classes         |       not set        | you probably have this
 /home/bob                 |       classes        | not recommended. See note 1.
 /home                     |     bob.classes      | not recommended.
 /                         |   home.bob.classes   | not recommended.

Примечание 1: Хотя в объявлении пакета можно указать почти ЛЮБОЕ значение, это не рекомендуется. Рекомендуемая практика состоит в том, чтобы структура пакета ваших классов была подстроена под расположение ваших исходных файлов относительно некоторого каталога 'package root'

Вот несколько примеров:

package declaration |   package root   | recommended path of source file
     z              | /home/b/project1 |   /home/b/project1/z/MyClass.java
    y.z             | /home/b/project1 |   /home/b/project1/y/z/MyClass.java

Каждая переменная среды, на которую вы ссылаетесь, имеет определенное «задание», которое, вероятно, будет полезно при выполнении некоторых заданий, когда вы узнаете больше о разработке Java.

CLASSPATH: список папок / jar-файлов, которые, как предполагается, являются корнями пакета для поиска файлов классов, от которых зависит ваш код. Это используется javac для перевода вашего файла dot-java в файл класса точек И это используется java для запуска вашего класса / программы java. Эта переменная игнорируется, если вы используете опцию -classpath в javac / java.

JAVAPATH: список папок / jar-файлов, которые, как предполагается, являются корнями пакета для поиска исходных файлов java, от которых зависит ваш код. Это используется командой javac. Эта переменная игнорируется, если вы используете опцию -sourcepath в javac.

JAVA_HOME: это корневой каталог вашей установки java. В вашем вопросе /home/bob/java/jdk1.5.0_06 - это JAVA_HOME. Эта переменная обычно используется программами, которые реализованы на языке Java. Такие инструменты, как javac и java, не используют JAVA_HOME, так как они могут вычислить его при выполнении. Чаще всего люди используют JAVA_HOME в сценарии оболочки своего проекта для запуска своей программы.

Я бы не рекомендовал использовать переменную окружения, на которую вы ссылаетесь. Я занимаюсь программированием на Java около 10 лет и редко их устанавливаю. Я склонен использовать параметры командной строки. Зачем? Потому что слишком легко забыть, каковы ваши переменные настройки, и оказаться в ситуациях, когда то, что вы думаете, происходит, не так.

6 голосов
/ 21 марта 2010

Вы можете использовать флаг -d для указания выходного каталога:

$ javac -d /home/bob/class /home/bob/output/a.java

Для получения полного списка опций Java-компилятора (javac) проверьте эту ссылку.

3 голосов
/ 21 марта 2010
javac -d /home/bob/class Test.java

Поместит ваш сгенерированный файл класса в указанную директорию

/home/bob/class/Test.class

А для других флагов вам нужно установить переменные окружения. Проверьте это

...