Компиляция Java, пакеты и относительные пути - PullRequest
2 голосов
/ 28 октября 2011

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

Например, для JavaПрограмма, которая включает в себя оператор package ch01.stacks;, вывод компиляции выглядит следующим образом:

 javac -g ch01\stacks\ArrayStack.java

и вывод выполнения run выглядит аналогично.

Мне было интересно, существует ли относительно простой способ симуляции этогоповедение в других программах, таких как Notepad ++ или gedit, где пользователи могут настраивать сценарии для компиляции программ.

РЕДАКТИРОВАТЬ: я извиняюсь, я забыл упомянуть, что сценарии компиляции, о которых я говорю, по сути являются именем файла программы, переданным в Javac .Я бы предпочел не использовать абсолютные пути, я хотел бы, чтобы мои скрипты работали аналогично jGRASP, если это вообще возможно.

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

То есть есть ли способ определить верхний каталог, необходимый для компиляции ( ch01 впредыдущий пример) без необходимости копаться в программе, ищущей package?

1 Ответ

0 голосов
/ 28 октября 2011

Я все еще не уверен, что вы хотите, и это не вписывается в комментарий.

Поведение jGRASP точно нормальное поведение.Файлы классов Java, как исходные, так и скомпилированные классы, живут в файловой иерархии, которая отражает имена их пакетов.Любой Java IDE или инструмент построения командной строки ( Ant , Maven , Gradle , что угодно) это понимает и ведет себя соответственно.

ЕслиВы искренне хотите заново изобрести эти колеса, ваш код должен сделать то же самое.Если ваш исходный Java-код не находится в канонической иерархии пакетов / файлов, то да, вам нужно будет запросить источник для объявления package каждого файла и поместить скомпилированный файл .class в соответствующий каталог. *Параметр 1015 *

javac -d устанавливает каталог вывода.Скомпилированные классы будут помещены в их правильное местоположение, основанное на их имени пакета.Однако при компиляции все импорты должны быть доступны на пути к классам, будь то ваши собственные классы или классы сторонних библиотек (обычно в банке).

Короче говоря: не выполняйте то, что вы проситеоколо.Я не могу придумать ни одной веской причины для этого.(Это не значит, что не является вескими причинами, но я ... очень скептически отношусь.) Можно даже использовать относительно консервированные make файлы для создания проектов Java;лучшее решение, чем то, что вы предлагаете, но все еще ужасная идея.

Примечание: Когда вы запускаете Java-приложение, файлы классов должны присутствовать в ожидаемой иерархии, будь то в виде файла jar (или war) или в файловой системе.

...