Gradle,"sourceCompatibility"与"targetCompatibility"?

Mik*_*der 116 java gradle

sourceCompatibility和之间有什么关系/区别targetCompatibility?当它们被设置为不同的值时会发生什么?

根据Gradle文档:

sourceCompatibility是"编译Java源时使用的Java版本兼容性". targetCompatibility是"为Java生成类的Java版本."

我的理解是,targetCompatibility将生成与特定版本的Java兼容的java字节码,这是一个功能的子集sourceCompatibility吗?

Mat*_*att 72

这映射到javac - 参见交叉编译部分 - source基本上是源语言级别,target是生成的字节码级别.


小智 55

使用这些时要小心; 我们被人们做出假设所困扰.

仅仅因为您使用1.5的sourceCompability(或targetCompatibility)并不意味着您始终可以使用JDK 1.6编译代码并期望它在JDK 1.5下工作.问题是可用的库.

如果您的代码恰好调用了一些仅在JDK 1.6中可用的方法,它仍将使用目标VM的各种兼容性选项进行编译.但是当你运行它时,它会失败,因为不存在违规方法(你会得到一个MethodNotFoundException或ClassNotFoundException).

出于这个原因,我总是将兼容性设置与我正在构建的实际Java版本进行比较.如果它们不匹配,我会失败.

  • `if(JavaVersion.current()!= JavaVersion.VERSION_1_8)抛出新的GradleException("这个项目需要Java 8,但它正在运行"+ JavaVersion.current())`这就是我如何解决这个问题,就在build.gradle文件的开头. (5认同)
  • 这是一个微妙但非常重要的观察. (4认同)
  • 从 Java 9 开始,现在有一个新的 `javac` 选项 `--release` 旨在解决这个问题,只允许使用指定 Java 版本中可用的 API。有关更多信息,请参见 /sf/answers/3017212691/ (3认同)
  • 你如何比较它们? (2认同)

小智 31

sourceCompatibility =指定用于编译.java文件的Java编程语言版本.例如sourceCompatibility 1.6 =指定使用Java编程语言的1.6版来编译.java文件.

默认情况下,sourceCompatibility ="当前正在使用的JVM的版本"和targetCompatibility = sourceCompatibility

targetCompatibility =该选项确保生成的类文件与targetCompatibility指定的VM兼容.请注意,在大多数情况下,-target选项的值是-source选项的值; 在这种情况下,您可以省略-target选项.

类文件将在targetCompatibility和更高版本指定的目标上运行,但不会在早期版本的VM上运行