Apache Foundation已发布了Groovy的3.0版,其中包括以下新功能:新的解析器,程序包名称空间更改,增强的Elvis运算符以及对Java语法的支持,例如do / while循环,数组初始化,lambda和方法引用。Groovy 3.0需要使用JDK9 +来构建应用程序,并且Java Runtime Environment(JRE)的最低受支持版本是JDK8。
Groovy 3.0引入了一个新的Groovy解析器,代号为Parrot。它的名称源于它打算继承现在继承的Antlr2解析器的“parrot”输出。Parrot被设计为更具灵活性和可维护性,并且还支持其他语法选项和语言功能。
当被问及传统与Parrot解析器在2018年夏季之间的区别时,对象计算(OCI)首席软件工程师,Groovy提交者兼副总裁Apache Groovy的Paul King说:
当我们谈论“ Parrot”解析器时,我们谈论的是Groovy 3编译器的全面改进。经过重新设计,使其更加灵活,并使用了近期得到良好支持的技术。这项工作使Groovy处于快速发展的有利位置,这意味着我们可以合并Java中的更改,以实现与Java的“剪切-粘贴”兼容性以及本机Groovy更改。
当我们谈到“印地”的支持时。这与在编译器的后期阶段产生的字节码有关。在2.0至2.5的Groovy版本中,我们支持生成“经典” Groovy字节码以及“ indy”版本。indy版本使用了JDK7中引入的“ INvoke DYnamic”字节码指令。
默认情况下,Parrot解析器处于启用状态,而继承解析器将暂不使用。可能会有无法使用Parrot编译的有问题的代码的开发人员可以通过**-Dgroovy.antlr4=false
**在命令行上添加系统属性来禁用它,并返回到传统解析器。但是,继承解析器最终将在Groovy 4.0中删除。
为了支持JDK9中首次引入的Java平台模块系统(JPMS),并且为了适应新的Groovy模块被视为头等舱模块,已经将几个Groovy类移到了不同的包名称空间。例如:
groovy.util.XmlParser
将移至 groovy.xml.XmlParser
groovy.util.XmlSlurper
将移至 groovy.xml.XmlSlurper
groovy.util.GroovyTestCase
将移至 groovy.test.GroovyTestCase
为了向后兼容,这些类将在两个包名称空间中都可用,但是传统名称空间最终将在Groovy 4.0中删除。
JDK14早期访问(EA)将于2019年夏季向Java社区提供,它提供了预期的新功能的预览。但是,结合使用JDK 14 EA,Groovy 2.5.x和Gradle 5.5.x发现了一些意外行为。在命令行上执行**groovy -version
Gradle任务(如)gradle clean
将引发异常。有趣的是,执行gradle -version
**将按预期工作。
Gradle利用基于Groovy的领域特定语言进行项目配置,从而支持Maven使用的XML。潜在的问题是Gradle依赖于Groovy 2.5,后者反射地调用了私有构造函数,**java.lang
**该构造函数已在JDK 14中删除。
Oracle高级软件开发经理Stephen Felts记录到:
这在JDK14 b8中已被打破。这是groovy-git / src / main / org / codehaus / groovy / vmplugin / v7 / Java7.java中的错误
似乎正在入侵Lookup的构造函数之一。构造函数是私有的,在JDK 14中不存在,因为我们已经将此区域进行了重构,以解决通过Lookup对象传送的问题。
有一个try / catch块,但它正在捕获SecurityException。从JDK9开始的此类错误会引发新的JDK9运行时异常。要编写可移植的代码,您不能捕获确切的异常,而要使用catch(RuntimeException)。
随着Groovy 3.0的发展,此问题已解决,但导致了重大更改。当被问及Apache JIRA中的这些重大更改时,King回答:
这取决于迁移到Groovy 3.0的过程中单个项目决定解决的数量。
仅作为一个示例,作为模块内JDK9 +包命名约定的一部分,
groovy.util.XmlParser
必须最终将其重命名为groovy.xml.XmlParser
,否则**groovy.util
,groovy
和groovy-xml
**模块中都将有一个包。对于Groovy 3.0,Groovy的“模块化jar”并不严格符合JDK模块,实际上我们都有两个可用的类。因此,对于像Gradle或CodeNarc之类的项目,如果碰巧使用XmlParser,它可能会决定现在做很少的事情并使用旧的类(但在转到Groovy 4时要做一些工作)或可以做一些事情现在更多,以避免以后的额外工作。
King谈到了此最新版本的挑战以及Groovy 4.0的期望。
您想与我们的读者分享有关Groovy 3.0的什么?
保罗·金(Paul King): Groovy 3是一个重要版本,其中包含约600个错误修复,改进和新功能。有80多种新的GDK方法,改进的嵌入Groovydoc的方法和新的AST转换,但是该版本以其全新的解析器而闻名。
新的解析器主要是内部细节,因为新的解析器更加灵活,因此使Groovy团队的工作更加轻松。我们使用了新的解析器,为语言添加了一些新功能,例如新的运算符(例如“
===
‘参考相等运算符,’!in
‘和’!instanceof
'运算符和Elvis赋值运算符)。还支持安全索引,例如
list?[ index ]
将返回null
。 还有许多现在支持的 Java 兼容性改变,包括 lambda 表达式、方法引用、var
保留类型、 do / while 循环、一些数组初始化语法、接口默认方法,甚至 JDK14中新的’’反斜杠转义序列。经过所有这些Java兼容性更改之后,Groovy 3似乎很可能在赶上Java。事实并非如此。Groovy通常支持对某些Java构造进行编码的更简洁和惯用的方式,但是支持Java语法也大大减少了从Java进入Groovy的开发人员的学习难度。
作为Groovy 3.0的最低构建要求,与JDK9相关的挑战是什么,这些挑战导致使用JDK14,Groovy 2.5.x和Gradle 5.5.x的问题?
**金:**有几个相关的问题:
- JDK9和更高版本开始弃用和删除所谓的内部类,其中一些类由Groovy(以及许多其他库)使用;我们已经远离那些内部类。
- JDK9及更高版本使用了一种发出非法访问警告的方法,该方法不是动态语言友好的。我们现在有时通过父方法或接口方法签名来调用方法(类似于Clojure使用的方法)
- Groovy依赖于其他库(例如ASM)来读取字节码,因此我们必须等到这些库支持特定的JDK版本。
- Groovy有一个JDK插件系统,可以在几个地方为不同的JDK版本使用不同的代码。我们可以更轻松地延迟加载旧的类,而这些类在以后的JDK版本中可能不会出现。
这项工作是针对Groovy 3的,但是某些部分又被移植到Groovy 2.5.x中。
结果,Gradle是否将被迫向Groovy 3.0过渡?
**King:**目前,Gradle与JDK14一起使用所需的所有功能都在Groovy 2.5.x中,因此,他们迁移到Groovy 3并没有立即的压力。
但是,转到Groovy 3将允许Gradle用户在其构建脚本中使用Groovy 3功能,例如lambda表达式。它还将允许Gradle关闭发出非法警告消息的配置设置。
最终,将只有Groovy 3及更高版本支持JDK版本,因此我们鼓励Gradle开始进行升级。
我们对Groovy生态系统中的其他库(例如Grails,Micronaut和Spock)在移植到Groovy 3方面取得的进展感到满意。
Groovy 4.0计划了哪些功能?
**金:**有些工作很大程度上是内部重构。Groovy的最新版本已支持调用动态(Indy)风味的字节码以及经典字节码。Groovy 4将全部基于Indy。
Groovy 3支持已经提到的新解析器,但也允许您切换回旧解析器。Groovy 4将仅支持新的解析器。
在新功能方面,我们正在研究众多功能,其中一些仍处于试验阶段。我们正在寻找与.NET语言集成查询(LINQ)等效的**
module-info
**Groovy,对用Groovy 编写文件的本机支持,对用Groovy编写记录的本机支持,对平台日志记录的改进支持以及用于处理Java片段的新JavaShell类。 。我们可能还会看到对Java 12/13开关表达式的本机支持(尽管Groovy的现有开关以多种方式具有更大的功能)。
Java和Groovy社区什么时候可以开始看到Groovy 4.0的alpha和beta版本?
**金:**实际上,我们已经准备好很快发布Groovy 4的第一个Alpha版。我们知道这还远未完成,因此这是决定何时发布并设定适当期望的问题。我预计将在未来几个月内发布。
对于Groovy来说还有什么呢?
**金:**我们将继续针对用户渴望进一步提高生产率的方案来改进Groovy。
一些用户正在将Groovy与GraalVM结合使用以提高性能,但是它并不理想地适用于动态语言。我们将研究使Graovy与GraalVM更好地配合工作的方法。我们也看到了数据科学家对Groovy的欢迎,因此我们将继续改善对他们的支持。
可以说Groovy作为JVM语言的最大贡献是它的可扩展性。我们将使用这种可扩展性来继续改善Groovy的动态和静态特性。
Groovy在本月庆祝了一个里程碑,因为从Maven Central和Bintray下载的Groovy工件数量超过了十亿。Groovy 3.0可以从下载页面下载,有关此最新发行版的完整详细信息可以在发行说明中找到。开发人员可以期望Groovy 4.0中改进的JPMS支持,并计划很快发布alpha版本。