我编写了一个很小的Groovy脚本(只有几条简单的指令),并将其命名为a-b.groovy
。
我的同事在运行它时遇到了麻烦,他说:
我认为'-'在Groovy脚本文件名中是非法
**问题:**Groovy文件名中非法字符的完整列表是什么?
- (注意:与Naming convention for groovy script files不同,我的问题与约定无关)*
我编写了一个很小的Groovy脚本(只有几条简单的指令),并将其命名为a-b.groovy
。
我的同事在运行它时遇到了麻烦,他说:
我认为'-'在Groovy脚本文件名中是非法
**问题:**Groovy文件名中非法字符的完整列表是什么?
3条答案
按热度按时间5m1hhzi41#
最准确的答案是使用与我们命名Java类相同的标准来命名Groovy脚本。Groovy与Java类似,支持Unicode字符编码,您可以 * 最有可能使用任何Unicode字符**作为脚本名称(这并不意味着您应该这样做)。
每个Groovy脚本都被编译成一个扩展
groovy.lang.Script
类的Java类。它的名称取自Groovy脚本文件名。看一下这个例子:当我们用
groovyc someSimpleGroovyScript.groovy
编译它时,我们会看到一个类文件someSimpleGroovyScript.class
。现在,如果我们看一下这个类是什么样子的:我们将得到如下结果:
Groovy脚本名称的角大小写
尽管Java类命名标准适用于Groovy脚本名称,但Groovy支持一些极端情况。
在脚本名称中使用
-
字符您可以将脚本命名为
a-b.groovy
,并作为Groovy脚本运行:您甚至可以使用
groovyc
编译它,以获得以下Java类:即使这个类名对于Java编译器不正确,您仍然可以使用Java运行它(您需要将
groovy-all
添加到类路径中):在脚本名称中使用
$
在Groovy中,您甚至可以将脚本命名为
123$.groovy
,并且可以简单地将其运行为:但是,Groovy编译器在将此脚本编译为Java类时会将
$
替换为下划线:输出量:
您仍然可以使用Java运行这样编译的脚本:
在脚本名称中使用空格
您也可以在脚本名称中使用空格,例如
this is script.groovy
可以执行为:但是Groovy编译器会将每个空格替换为下划线:
您仍然可以使用Java运行这样编译的脚本:
使用
class.groovy
作为脚本名称您可以创建一个名为
class.groovy
的脚本,它将编译为以下Java类:javac
编译器永远不会允许您编译具有这样名称的类,但是java
在运行这样的字节码时没有问题:wixjitnu2#
由于脚本的文件名用于生成相应的类名,因此将限制为有效的java类名Valid characters in a Java class name
您几乎可以使用任何字符,包括大多数Unicode字符!确切的定义在Java语言规范的3.8节中:标识符。
一个标识符是一个无限长的Java字母和Java数字序列,其中第一个必须是Java字母。
字母和数字可以从整个Unicode字符集中提取,...这允许程序员在他们的程序中使用以他们的母语编写的标识符。
标识符不能与关键字(参见3.9节)、布尔型文字(参见3.10.3节)或空文字(参见3.10.7节)有相同的拼写(Unicode字符序列),否则会发生编译时错误。
0mkxixxg3#
我遇到了一个奇怪的问题,脚本的文件名中包含一个破折号,函数的参数为
Closure
让我们考虑这个例子,
test-script.groovy
:在我的
Groovy 2.4.16
开发环境中,它的工作原理非常好,它会打印:在具有
Groovy 2.4.5
的prod env上,我收到以下错误:如果我将
test-script.groovy
重命名为testScript.groovy
,它将同时适用于2.4.16和2.4.5版本我追踪到了X1 M6 N1 X的“bug修复”。在这个版本之前,它失败了。
此版本的changelog未指出任何相关修复,因此可能已包含在另一个错误修复中。
不管怎么说,我已经被这个案子困了几个小时了,所以如果它能帮助别人,那是好事!