Java9——发布标志不';我似乎不在格拉德尔工作

Java9——发布标志不';我似乎不在格拉德尔工作,java,gradle,compiler-errors,java-9,Java,Gradle,Compiler Errors,Java 9,Gradle正式引述,使用JDK9+构建Java应用程序以在Java 8环境上运行的方法是使用标志--release 8: 我尝试这样做,但是编译器仍然抛出一个错误: module myapp.main { ^ (use -source 9 or higher to enable modules) 1 error :compileJava FAILED 根据该文档和许多stackoverflow文章(如),当目标为8时,编译器应该忽略模块文件,但事实并非如此。为什么呢 渐变代码: com

Gradle正式引述,使用JDK9+构建Java应用程序以在Java 8环境上运行的方法是使用标志
--release 8

我尝试这样做,但是编译器仍然抛出一个错误:

module myapp.main {
^
  (use -source 9 or higher to enable modules)
1 error
:compileJava FAILED
根据该文档和许多stackoverflow文章(如),当目标为8时,编译器应该忽略模块文件,但事实并非如此。为什么呢

渐变代码:

compileJava {
    dependsOn(':compileKotlin')
    options.compilerArgs.addAll(['--release', '8'])
    doFirst {
        println classpath.asPath
        options.compilerArgs += [
                '--module-path', classpath.asPath,
        ]
        classpath = files()
    }
}
发件人:

--发布
发布

针对特定VM版本的公共、受支持和有文档记录的API进行编译。支持的
release
目标是
6
7
8
9

我认为这意味着编译器将处理在以后版本中引入的任何公共方法和类,就像它们不存在一样。例如,如果使用
--release8
编译的代码导入或引用java.lang.Module,编译器将发出一个错误,指出该类不存在

我没有看到Gradle文档中有任何部分说明
--release
是针对Java8JVM的首选或官方方式。我只看到使用
--release
作为如何添加自定义编译器选项的示例

归根结底,如果您想为Java8编译,您需要排除module-info.Java

如果您想要一个既可以作为模块使用,又可以被Java8视为普通的.jar的.jar,那么您可能需要一个

多版本jar是Java9引入的一个概念。如果忽略.jar中除清单之外的所有META-INF条目,它看起来与9.jar之前的版本一模一样。没有模块信息,没有Java 9+类文件

所有Java 9版本都存在于.jar文件的
META-INF/versions/9
下。例如,.jar文件中的某些条目可能是:

  • META-INF/versions/9/module info.class
  • META-INF/versions/9/com/example/myapp/MyApplication.class
为了向Java 9+运行时发出.jar是一个多版本的.jar的信号,您将这个清单条目添加到.jar中:

Multi-Release: true

至于如何在Gradle中完成所有这些,建议创建。我不使用Gradle进行构建,因此从文档中我并不完全清楚如何进行构建。从投票数和上的答案数来看,似乎其他人对此也不清楚。

这个问题已经有将近一年的历史了,但也许它仍然会有帮助:“关于为什么
模块信息.java
不会被
--release 8
标志忽略的原因,
的答案绝对正确

当谈到如何编译主Java8类+Java9
module info.Java
时,Gradle模块插件从版本开始就支持此功能。更多详细信息可在此处找到:


我想你误读了。“
module-info.class
文件将被旧的JVM忽略”并不意味着编译时module-info.java将被忽略,而是意味着由java 9编译器创建的已编译的module-info.class文件将在运行时被忽略。@VGR说得好,我确实读错了。然而,删除module-info.java实际上会导致编译器说每个包和导入都不存在——因此它必须需要该文件才能存在。特别是因为那篇文章谈到了.class文件被忽略,因此类文件必须使用.java等效文件进行编译。