代码之家  ›  专栏  ›  技术社区  ›  Gunnar

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

  •  7
  • Gunnar  · 技术社区  · 7 年前

    我想使用 JEP 330 用Java(& gt;=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 回复  |  直到 7 年前
        1
  •  2
  •   Mikhail Kholodkov    7 年前

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

    简短的回答:你不能。

    这个犹太人的目标不是取代 javac !这仅仅是为了使它更方便,特别是在开始编程的上下文中,以实现“运行这个程序”的目标。


    JEP-330 与标准JavaC& GT;Java链相比有一组限制。引自Jep本身:

    在JDK 10中,Java发射器以三种模式运行: 类文件,启动JAR文件的主类,或启动 模块的主要类。这里我们添加了一个新的第四种模式:启动 在源文件中声明的类。

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

    java HelloWorld.java

    非正式地等同于

    javac -d <memory> HelloWorld.java

    java -cp <memory> hello.World

    任何放在原始命令行中源文件名之后的参数在执行时都会传递给已编译的类。 . 例如,如果一个名为factorial.java的文件包含一个名为factorial的类来计算其参数的factorial,那么命令

    java Factorial.java 3 4 5

    非正式地等同于

    javac -d <memory> Factorial.java

    java -cp <memory> Factorial 3 4 5

    在源文件模式下,任何其他命令行选项都将按以下方式处理:

    • 为了编译源文件,启动程序会扫描源文件前面指定的选项以查找任何相关选项。这包括:--类路径,--模块路径,--添加导出,--添加模块,--限制模块,--修补模块,--升级模块路径,以及这些选项的任何变体形式。它还包括新的——启用预览选项,如jep 12所述。

    • 没有规定将任何附加选项传递给编译器,例如-processor或-werror。


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

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

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

    • 如果类路径中存在现有的类文件,则必须使用它 -对于一个文件来说,比如 SampleClass.java 如果一个现有的类文件,比如, SampleClass.class 存在,您不能调用 爪哇 在源文件模式下运行源文件的工具。

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

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

    • 对源文件中的公共文件没有限制 -而 贾瓦克 关心源文件中公共类的数量, 爪哇 不能不在乎。

    • 不能传递某些特定于编译器的参数 -争论就像 -Werror -nowarn 你可以传给 贾瓦克 不得被 爪哇 工具。

    推荐文章