当前位置: 首页 > 科技观察

Gradle:我可以控制你能不能编译运行

时间:2023-03-13 03:12:25 科技观察

大家好,我是北君。今天就带大家了解一下Gradle中sourceCompatibility和targetCompatibility的使用配置和区别。Java中的版本处理在了解Gradle中的sourceCompatiblity和targetCompatibility之前,我们先来看看Java在编译时是如何处理版本号的。当我们使用javac编译Java程序时,可以提供如下两个编译选项来关闭版本,进行版本处理。-source是指我们的Java代码与编译后的JDK匹配的语言版本(例如,JDK8为1.8)。我们提供的版本值将限制源代码中使用的语言特性以匹配相应的Java版本。-target是指控制生成的类文件的版本。也就是说,我们提供的版本值将是我们的程序可以运行的最低Java版本。例如javacHelloWorld.java-source1.6-target1.8上面的命令表示程序的运行环境需要支持JDK1.8,即Java8,源代码不能包含Java6及以上的语言特性,比如Lambda表达式等。Gradle中的版本需要依赖Gradle中的Java插件,然后通过一个叫做java的任务配置sourceCompatibility和targetCompatibility属性,即javac中的-source和-target编译选项.让我们设置build.gradle文件plugins{id'java'}group'cn.javanorth'java{sourceCompatibility="1.6"targetCompatibility="1.8"}通过一个例子来验证它:我们创建一个名为HelloWorld的控制台程序来测试,创建一个HelloWorldApp类。publicclassHelloWorldApp{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}好了,我们使用gradlebuild命令编译,可以看到生成了一个HelloWorldApp。类文件。我们使用javap命令行工具检查这个类的字节码版本号。javap-verboseHelloWorldApp.class输出如下:publicclasscn.javanorth.helloworld.HelloWorldAppminorversion:0majorversion:52flags:ACC_PUBLIC,ACC_SUPER这里的majorversionnumber是52,是Java8类文件。这意味着HelloWorldApp.class只能在JDK1.8或更高版本上运行。让我们再次测试sourceCompatibility。我修改了代码,添加了一个Java6没有的特性,比如Lambda表达式。publicclassHelloWorldApp{publicstaticvoidmain(String[]args){RunnablehelloLambda=()->{System.out.println("HelloWorld!");}helloLambda.run();我们尝试使用gradle进行Compile,可以看到有编译错误。error:lambdaexpressionsarenotsupportedin-source1.6-source选项相当于Gradle配置中的sourceCompatibility,可以让我们的代码在编译过程中提前发现问题。如果我们不想引入更高版本的特性,使用这个选项可以保证我们不误用这些特性。例如,我们可能希望我们的应用程序也能在Java6运行时上运行。总结在本文中,我们看到了如何使用-source和-target编译选项来处理我们的Java源和目标运行时版本。我们还可以通过Gradle的sourceCompatbility和targetCompatibility配置使用这些编译选项。