如何在运行单个文件源代码Java程序时传递编译器选项



我想使用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.

在这种情况下,我如何指定这样的编译器特定选项?

在这种情况下,我如何指定这样的编译器特定选项?

简短回答:你不能。

这个JEP的目标不是取代javac!这只是为了让它更方便,尤其是在开始编程以实现"运行此程序"的目标的情况下。


JEP-330与标准javac->java链相比有一组限制。JEP本身的报价:

从JDK10开始,java启动器有三种模式:启动类文件,启动JAR文件的主类,或者启动模块的主类。在这里,我们添加了一个新的第四种模式:启动在源文件中声明的类。

在源文件模式下,效果就像源文件被编译到内存中,并且在源文件中找到的第一个类被执行。例如,如果名为HelloWorld.java的文件包含一个名为hello的类。世界,然后命令

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路径、--module路径、--add导出、--add模块、--limit模块、--patch模块、--upgrade模块路径,以及这些选项的任何变体形式。它还包括新的--enable预览选项,如JEP12所述。

  • 没有提供任何附加选项给编译器,例如-processor或-Werror

。。。


换句话说,在运行单文件源代码Java程序时,应该记住某些限制:

  • 没有外部类,只有单个文件程序-您不能调用除正在执行的文件之外的文件中的任何其他类。

  • 没有可用的类文件-以这种方式调用java工具不会生成您可以在工作目录中看到的任何*.class文件。

  • 如果类路径中存在现有的类文件,您将被迫使用它-对于一个文件,例如SampleClass.java,如果存在现有的类别文件(例如SampleClass.class(,您可能不会调用java工具以源文件模式运行源文件。

  • 文件名,而不是类名-java工具在执行源文件时会考虑文件名而不是类名。

  • 文件中的第一个类,与文件类名不匹配-类加载器不再通过匹配文件名和类名来确定要执行的类。文件中的第一个类是将要运行的

  • 对源文件中的公共文件没有限制-虽然javac关心源文件中公共类的数量,但java却毫不关心。

  • 您可能不会传递某些编译器特定的参数-您可以传递给javac的参数(如-Werror-nowarn(可能不会被java工具传递(或识别(。

简单回答:你不能。

错了,你可以

奇怪的是,--source 11选项必须出现两次:Beforeafter所有其他选项:

#!/usr/bin/java --source 11 -ea -cp path/to/jars --source 11
// There appears to be a bug in JDK 11.0.2 single-file mode: The first option must
// be "--source 11" to enable single-file mode, but then the "-cp" DISABLES
// single-file mode (bug). The workaround is to repeat the "--source 11" option
// right after the "-cp" option.

测试

java version "11.0.2" 2019-01-15 LTS
GNU bash, Version 4.4.12(3)-release (x86_64-unknown-cygwin)

相关内容

最新更新