Запуск .java файла в режиме Single-File Source-Code и иморт классов

Решаю задание с такими формулироваками для Java 21:

  1. В данном задании важно показать понимание ООП, умение строить модели (выделять классы, интерфейсы, их связи), разделять функционал между ними
  2. Все классы должны быть в пакете src/main/java/ru/organisation/check
  3. main-класс: ./src/main/java/ru/organisation/check/CheckRunner.java
  4. Приложение должно запускаться с помощью консольной команды: java -cp src ./src/main/java/ru/organisation/check/CheckRunner.java id-quantity discountCard=xxxx balanceDebitCard=xxxx

Насколько я понимаю запуск в режиме java FileName.java имеет следующие особенности:

  1. Java сама найдет точку входа
  2. Это аналогично компиляции в память
  3. Файл может содержать много классов
  4. В cp не должно быть скомпилированной версии главного класса
  5. Все зависимости в виде .jar или .class должны лежать в cp

Но тогда от меня ускользает смысл такого типа запуска. С одной стороны хотят посмотреть умение проектировать, с другой надо бы все классы и интерфейсы сложить огромной кучей в один файл. Или скомилировать. Но без main класса, тогда почему бы и его не скомилировать тоже.

Я что-то упускаю? Что-то просмотрел?


Ответы (1 шт):

Автор решения: Komdosh

Сложно сказать, что именно хотят проверить в задаче. Чем отличается компиляция от интерпретации? По сути это аналогия запуска скрипта, но на Java: JEP 330: Launch Single-File Source-Code Programs

По вашим пунктам:


Java сама найдет точку входа

Не совсем. Точкой входа всегда является public static void main(String[] args). Когда вы пишите:

./src/main/java/ru/organisation/check/CheckRunner.java

Вы указываете в каком именно классе искать main. В Java 21 можно написать void main() {} без указания класса.


Это аналогично компиляции в память.

Да, это пропуск шага сохранения скомпилированного .class файла на файловую систему. Этот файл существует только в оперативной памяти (по сути кэш).


Файл может содержать много классов

Да это так. По аналогии и с другими интерпретируемыми языками (JavaScript, Python и др).


В cp не должно быть скомпилированной версии главного класса.

Да. Это логично, так как коллизий имён (пространства имён) быть не должно.


Все зависимости в виде .jar или .class должны лежать в cp

Да. Если вы хотите использовать заранее скомпилированные (например внешние) библиотеки, вы должны их предоставить в момент запуска скрипта.


ИМХО: Проверяющие хотят иметь простой способ запуска и проверки вашего проекта, без лишних телодвижений. Сначала проверят работоспособность, а затем код (а он лежит в одном файле, что удобно).

Ещё варианты:

  • у них есть автоматический тестовый скрипт, который проверяет вашу программу.
  • у них есть автоматический скрипт, который оценит ваш код.
  • они отправят ваш код в чат нейросети для оценки
→ Ссылка