Соглашение о компиляции и выполнении приложений Java из оболочки?

Какое соглашение используется для компиляции и выполнения приложений Java из оболочки? В качестве конкретного случая использования я учу некоторых детей читать исходный код Java и выбирать мини-шкатулку (которая представляет собой закомментированную версию записи Notch Ludum Dare 22). Это довольно увлекательно для них, но я уже 10 лет отстаиваюсь от царства Java, и, честно говоря, я хотел бы одновременно научить их, как использовать оболочку и менее надежные (т.е. не IDE) редакторы перед прыжком в Затмение и тому подобное. Я хотел бы понять:

A) Какую команду оболочки вы бы выполнили для компиляции и запуска приложения (и из какой папки проекта; т.е. miniventure или же miniventure/src или же miniventure/src/com/mojang/ld22) а также

Б) Зачем нужно знать, как создавать проекты и оболочку? java а также javac аргументы для дальнейшего использования при копании в других проектах из src, таких как этот?

1 ответ

Решение

Учитывая ограничение на работу только в командной оболочке, лучший способ справиться с компиляцией - запустить javac из корня вашего classpath, прямо в каталоге, который содержит любой пакет верхнего уровня, который вы определили для вашего исходного кода (похоже, возможно miniventure/src в твоем случае). Вы можете просто запустить Java c и использовать -cp (сокращение от classpath) аргумент командной строки для определения корня вашего classpath. Поскольку вы учите новых программистов, вы можете использовать длинную форму того же варианта, -classpath чтобы подчеркнуть, что они устанавливают путь к классам Java.

Если вы запускаете javac из корня вашего classpath, обычно просто используется точка для ссылки на тот же каталог: javac -cp .; потому что javac будет проходить через структуру каталогов (пакетов), чтобы найти все исходные файлы (все, что имеет расширение имени файла.java), но документы для javac рекомендуют более структурированный подход:

Есть два способа передать имена файлов исходного кода в javac:
  • Для небольшого количества исходных файлов просто перечислите имена файлов в командной строке.
  • Для большого количества исходных файлов перечислите имена файлов в файле, разделенные пробелами или переносами строк. Затем используйте имя файла списка в командной строке javac, которому предшествует символ @.

Если вы запустите javac таким образом, он поместит файлы классов рядом с исходными файлами, но затем все файлы классов будут смешаны с исходными файлами и могут быть разбросаны по структуре каталогов / пакетов. Обычный способ справиться с этим - использование javac -d аргумент командной строки, который определяет каталог, в который должны быть записаны скомпилированные классы; javac сохранит структуру пакета и создаст любую структуру каталогов, необходимую во время компиляции. Стандартным способом определения этой опции всегда был каталог с именем: classes это брат к источнику (или src в вашем случае) каталог. Итак, вы бы создали новый каталог: miniventure/classes и тогда ваша командная строка будет включать в себя: -d ./classes,

Поскольку вы учите новых программистов, вам нужно будет включать информацию об отладке во время компиляции, поэтому, когда они сталкиваются с ошибками или исключениями, трассировка стека будет включать подробную информацию об отладке. Параметр командной строки javac для этого: -g который сгенерирует файлы классов со всеми включенными опциями отладки; это будет включать следующие параметры отладки:

  • источник, содержащий информацию об отладке исходного файла
  • строки, которые включают номер строки в отладочной информации исходного файла, и
  • Vars, который включает в себя информацию отладки локальной переменной
  • И, наконец, поскольку может быть полезно, чтобы новые программисты видели все подробно, вы можете включить -verbose опция, которая сообщает javac выводить очень подробные сообщения, включая каждый загруженный класс и каждый файл исходного кода, который компилируется.

    Итак, собрав все это вместе, ваша командная строка javac будет выглядеть так:

    javac -classpath . -d ./classes -g -verbose
    

    При том понимании, что я не включил опцию для перечисления каждого файла исходного кода в командной строке или использовал аргумент @ для ссылки на файл, который содержит список имен файлов. Лично я никогда не использовал эту опцию, и мне кажется, она кажется мне слишком сложной. Надеюсь, что это полезно -

    Другие вопросы по тегам