philX
@philX

Зачем нужен второй аргумент javac — classpath ./classes -d ./classes src/myproject/*.java?

Только вчера взялся за Java и уже начались глупые вопросы :)
Всё по порядку. Столкнулся я с тем, что файлы с примерами из книги компилились, но не хотели запускаться. Методом тыка было установлено (так как инета у меня на тот момент не было), что при удалении из исходников строк package %packageName% всё начинает нормально работать. Мне известно о пакетах и прочих похожих концепциях из других языков, поэтому я решил, что с этим надо разобраться, ибо негоже просто удалять подобные директивы, надо уметь ими пользоваться. В итоге я въехал в процесс правильной организации всей этой кухни, теперь всё правильно хранится, компилится и работает. Но один нюанс мне остался не ясен. Сейчас я просто покажу порядок своих действий.

$ mkdir HelloWorld // создаём папку с будущим проектом
$ cd HelloWorld
$ mkdir src/mypackage // создаём папку для исходников, а в ней папку для пакета mypackage
$ mkdir classes // тут будут скомпилированные файлы *.class
// теперь в папке src/mypackage размещаем исходные файлы, входящие в этот пакет, в каждом из которых указываем package mypackage;
$ javac -classpath ./classes -d ./classes src/mypackage/*.java // в результате компиляции в папке ./classes появится папка mypackage, содержащая все откомпилированные файлы классов
$ java -classpath ./classes mypackage.HelloWorld // запускаем JVM и передаём ей "главный" класс приложения. Всё работает. Все довольны.

Вроде бы я всё правильно делаю (по крайней мере, всё работает правильно). Но сама командная строка, в которой происходит компиляция, мне не до конца ясна. Зачем я два раза указываю каталог ./classes? Когда я указываю его после ключа -d, я говорю этим, что готовые скомпилированные файлы надо положить в каталог ./classes, то есть он будет корнем для результата. Так? А что я указываю первым упоминанием этого же каталога сразу после ключа -classpath? Не указывать его нельзя (я пробовал). В то же время, вместо него можно указать любой левый каталог, при этом всё будет работать как и раньше, когда я указывал ./classes.
Вообщем, если Вам не лень всё это прочитать и ответить, буду весьма признателен. Не хотелось бы на первых порах упускать такие нюансы. Я ведь только для этого и не стал пользоваться никакой средой разработки, только чтобы сначала правильно въехать в такие вот детали.
  • Вопрос задан
  • 483 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Sk1talec
Фанат Java, Android и компьютерного зрения :)
Во-первых, вместо -classpath можно использовать более короткий алиас -cp.
Во-вторых, с помощью это директивы ты указываешь компилятору, где искать ИСХОДНЫЕ файлы, файлы классов и файлы аннотаций от которых зависит твой проект.

Стандартный подход к компиляции такой.
После -cp ты указывешь папку, в которой лежат твои исходные файлы, и через ";" пути до .jar библиотек.
После -d "./classes" стандартный путь для скомпилированных файлов
Последним параметром указываешь путь до входной точки программы. Файла, содержащего
public static void main(String[] args) {}. К примеру src/ru/myproject/Main.java

Более подробно описано в официальной документации javac
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы