【问题标题】:Why does Groovy compiler reject the dependency JSR308 Type Annotations Compiler?为什么 Groovy 编译器会拒绝依赖 JSR308 Type Annotations Compiler?
【发布时间】: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 中进行了解释。

标签: java groovy jsr


【解决方案1】:

我已经重试了多个版本的 groovy。它不适用于 2.5 版本,但在 2.0.0 中,我的命令实际上在技术上可以编译。不幸的是,除了这个基本示例之外,还有一些其他的兼容性问题,如果没有必要,我不建议任何人尝试让 groovy 与 JSR-308 一起工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多