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

时间:2018-12-15 21:10:30

标签: java javac java-11

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

在这种情况下,如何指定此类特定于编译器的选项?

2 个答案:

答案 0 :(得分:2)

  

在这种情况下,如何指定此类特定于编译器的选项?

简短的回答:您不能。

此JEP的目标不是取代javac!仅仅是为了使其更加方便,特别是在开始编程的情况下,以实现“运行该程序”的目标。


与标准javac-> java链相比,

JEP-330有一系列限制。 JEP本身的报价:

  

从JDK 10开始,java启动器以三种模式运行:启动a   类文件,启动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文件。 / p>

  • 如果类路径中存在现有的类文件,则您将不得不使用它-对于文件,请说SampleClass.java,而现有的类文件应说{{ 1}}存在,您可能无法调用SampleClass.class工具在源文件模式下运行源文件。

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

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

  • 对源文件中的公共文件没有限制-尽管java关心源文件中公共类的数量,但是javac不在乎更少。

  • 您不得传递某些特定于编译器的参数-您可以传递给java的{​​{1}}或-Werror之类的参数可能不会通过-nowarn工具传递(或为此被认可)。

答案 1 :(得分:0)

简短的回答:您不能。

错了,你可以

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

#!/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)