【发布时间】:2019-12-09 07:30:14
【问题描述】:
我一直在努力理解为什么 groovyc 暂时不想编译我的代码,最后我将其缩小到不喜欢依赖项 JSR308 Type Annotations Compiler,它使用 java.lang.annotations 作为其包名称之一。
当 groovyc 尝试在其类路径中使用此 jar 编译我的代码时,将打印以下内容:
groovyc -cp jsr308-compiler-1.7.5.jar EmptyClass.groovy
>>> a serious error occurred: null
>>> stacktrace:
java.lang.ExceptionInInitializerError
at org.codehaus.groovy.classgen.Verifier.<clinit>(Verifier.java:137)
at org.codehaus.groovy.control.CompilationUnit.<init>(CompilationUnit.java:171)
at org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit.<init>(JavaAwareCompilationUnit.java:66)
at org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit.<init>(JavaAwareCompilationUnit.java:57)
at org.codehaus.groovy.tools.FileSystemCompiler.<init>(FileSystemCompiler.java:64)
at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:224)
at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompile(FileSystemCompiler.java:163)
at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompileWithErrorHandling(FileSystemCompiler.java:203)
at org.codehaus.groovy.tools.FileSystemCompiler.main(FileSystemCompiler.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:110)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:128)
Caused by: java.lang.SecurityException: Prohibited package name: java.lang.annotation
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at org.codehaus.groovy.tools.RootLoader.oldFindClass(RootLoader.java:174)
at org.codehaus.groovy.tools.RootLoader.loadClass(RootLoader.java:146)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.codehaus.groovy.ast.ClassHelper.<clinit>(ClassHelper.java:129)
... 15 more
运行javac -cp jsr308-compiler-1.7.5.jar EmptyClass.java 成功编译虚拟类。
java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
groovy -version
Groovy Version: 3.0.0-beta-2 JVM: 1.8.0_222 Vendor: Private Build OS: Linux
从 what I have read 开始,类型注释项目早在 2014 年就被集成到 JDK 8 中,所以我不知道为什么 groovyc 不承认这个依赖项有权使用 java.lang.annotation 作为包名。
[更新] 根据要求,这里是 EmptyClass.groovy 和 EmptyClass.java 的代码:
public class EmptyClass {
}
【问题讨论】:
-
您忽略了包含您的课程。此外,请注意 Groovy 3;虽然他们打算以 Java 8 为目标,但它实际上是 Java 9 原生的(因为在 Jigsaw 下工作需要大修),看到问题我不会感到震惊。
-
@chrylis 我最初尝试使用 2.4.5 进行编译并且遇到了同样的问题。感谢您的链接! “Groovy 一直在改进对最近版本的 JSR-308 支持。作为实现新语法的一部分,添加了额外的支持。”这是否意味着 Groovy 从未支持 JSR 308,还是只是 Groovy 3?
-
我猜它没有被完全支持;我自己从未使用过 JSR 308,所以我不能说。你试过2.5吗?
-
您为什么要尝试使用 JSR 308 类型注释编译器?自 Java 8 于 2014 年 3 月发布以来,javac 已支持类型注释。使用类型注释编译器的唯一原因是,如果您的代码必须使用 Java 7 编译器进行编译,但您想使用类型注释。这在其homepage 中进行了解释。