Как передать параметры компилятора при запуске однофайловой Java-программы с исходным кодом? - PullRequest
0 голосов
/ 16 декабря 2018

Я хотел бы использовать JEP 330 для запуска однофайловой программы с исходным кодом на Java (> = 11).

В этом случае я хотел бы передатьпараметры, понятные компилятору (javac), но не время выполнения (java), например -XDsuppressNotes.Это приводит, например, к неудаче следующего вызова:

java --enable-preview --source=12 -XDsuppressNotes Test.java

Unrecognized option: -XDsuppressNotes
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Как в этом случае указать такую ​​специфичную для компилятора опцию?

1 Ответ

0 голосов
/ 17 декабря 2018

Как я могу указать такую ​​специфичную для компилятора опцию в этом случае?

Краткий ответ: вы не можете.

Цель этого JEP - незаменить javac!Это просто для того, чтобы сделать его более удобным, особенно в контексте начала программирования для достижения цели «запустить эту программу».


JEP-330 имеет ряд ограниченийпо сравнению со стандартным javac -> цепочка java.Цитаты из самого JEP:

Начиная с JDK 10, средство запуска Java работает в трех режимах: запуск файла класса, запуск основного класса файла JAR или запуск основного класса модуля,Здесь мы добавляем новый, четвертый режим: запуск класса, объявленного в исходном файле.

...

В режиме исходного файла эффект такой, как будто исходный файл скомпилирован впамяти, и первый класс, найденный в исходном файле, выполняется.Например, если файл HelloWorld.java содержит класс hello.World, то команда

java HelloWorld.java

неофициально эквивалентна

javac -d <memory> HelloWorld.java

java -cp <memory> hello.World

Любые аргументы, помещенные после имени исходного файла в исходной командной строке, передаются скомпилированному классу при его выполнении .Например, если файл Factorial.java содержит класс Factorial для вычисления факториалов его аргументов, то команда

java Factorial.java 3 4 5

неофициально эквивалентна

javac -d <memory> Factorial.java

java -cp <memory> Factorial 3 4 5

В режиме исходного файла любые дополнительные параметры командной строки обрабатываются следующим образом:

  • Модуль запускасканирует параметры, указанные перед исходным файлом, на предмет наличия каких-либо значимых параметров для компиляции исходного файла.Это включает в себя: --class-path, --module-path, --add-exports, --add-modules, --limit-modules, --patch-module, --upgrade-module-path и любой вариантформы этих вариантов.Он также включает новую опцию --enable-preview, описанную в JEP 12.

  • Не предусмотрено никаких дополнительных параметров для передачи компилятору, таких как -processor или-Werror.

...


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

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

  • Нет доступных файлов классов - при вызове инструмента java таким образом не получается никаких файлов *.class, которые можно увидеть в вашемрабочий каталог.

  • Если существующий файл класса существует в classpath, вы вынуждены использовать его - Для файла, скажем SampleClass.java, должен существующий классфайл, скажем, SampleClass.class существует, вы не можете вызвать инструмент java для запуска исходного файла в исходном файле mode.

  • Имя файла, а не имя класса - инструмент java учитывает имя файла, а НЕ имя класса при выполнении исходных файлов.

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

  • Нет ограничений на общедоступные файлы в исходном файле - Хотя javac заботится о количествеиз открытых классов в исходном файле java не заботится.

  • Вы не можете передавать определенные специфичные для компилятора аргументы - такие аргументы, как -Werrorили -nowarn, который вы можете передать javac, не может быть передан (или признан в этом отношении) инструментом java.

...