【问题标题】:What versions of Java can Grails 4.X run with?Grails 4.X 可以运行哪些 Java 版本?
【发布时间】:2020-05-21 14:14:32
【问题描述】:

我已经阅读了 Grails 4.X 文档,该文档似乎没有说明它可以使用的 Java 版本,只是说它不再适用于 java 7。

在安装 Grails 4.0.3 之前,您至少需要安装 Java Development Kit (JDK) 1.8 或更高版本。

-- http://docs.grails.org/latest/guide/gettingStarted.html

我正在使用 sdk-man 在我的 mac 上安装 14.0.1+7 运行。当我尝试构建现有的 grails 项目或创建新项目时,它会失败并出现错误。

重现步骤:

  1. 使用 sdk-man sdk install java 14.0.1-open安装 jdk 14

  2. 安装 Grails sdk install grails 4.0.3

  3. 创建 Grails 项目grails create-app MyApp

  4. 结果

$ grails create-app testJDK14
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
        at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)
        at org.codehaus.groovy.reflection.GroovyClassValueFactory.<clinit>(GroovyClassValueFactory.java:35)
        at org.codehaus.groovy.reflection.ClassInfo.<clinit>(ClassInfo.java:107)
        at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:95)
        at org.codehaus.groovy.reflection.ReflectionCache.<clinit>(ReflectionCache.java:39)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:209)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:107)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:85)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:36)
        at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:86)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.bitwiseNegate(ScriptBytecodeAdapter.java:842)
        at org.grails.config.NavigableMap.<clinit>(NavigableMap.groovy)
        at org.grails.cli.GrailsCli.<clinit>(GrailsCli.groovy:77)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
        at org.codehaus.groovy.runtime.dgmimpl.NumberNumberMetaMethod.<clinit>(NumberNumberMetaMethod.java:33)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:124)
        at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:346)
        at java.base/java.lang.Class.newInstance(Class.java:604)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.createMetaMethodFromClass(MetaClassRegistryImpl.java:257)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:110)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:85)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:36)
        at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:86)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.bitwiseNegate(ScriptBytecodeAdapter.java:842)
        at org.grails.config.NavigableMap.<clinit>(NavigableMap.groovy)
        at org.grails.cli.GrailsCli.<clinit>(GrailsCli.groovy:77)

我发现了一个带有 jdk 14 和 gradle 5.1.1 的 related issue,Grails 附带它建议将 gradle 升级到 6.3+。它不是 Grails 特有的。

所以我在我的 Grails 项目中使用 gradle-wrapper.properties 文件升级了 gradle,但仍然收到相同的结果,尽管这对许多使用 Gradle 而不是 Grails 的人来说清除了它。

是否有已知可用于 Grails 4.X 的 JDK 列表?

【问题讨论】:

  • 切换到 Java 8。Java 9 引入了一个模块系统,出乎意料地破坏了许多项目的向后兼容性。如果您看到有人说使用 Java 8 或更高版本,请坚持使用 Java 8;除非您找到明确表明它支持其他版本的内容。 Grails 需要 Groovy 2.5 并且 目前在使用 Java 9 快照时的某些方面存在一些已知问题。
  • 我现在也尝试过 java 11,但同样的错误。我很高兴继续使用 Java 8,但我想知道 Graeme 或 Grails 项目是否有一些官方推荐。也许他们的文档只说 Java 8 而不是 Java 8+ 会更好。
  • 我同意。如果更新他们的文档会更好。
  • 你知道它是否会被认为是一个错误吗?如果是,我可以使用 Github 问题跟踪器记录问题。我开始了,它建议先在这里问一个问题。
  • 我应该说,我想升级 JDK 的部分原因是我想利用 10 之后添加的 Docker 内存功能。medium.com/adorsys/…,虽然我看到它被向后移植到 8u191 ,所以也许我很清楚。

标签: java grails java-14


【解决方案1】:

grails 4.0.x 不支持的JDK14。使用 LTS 版本,例如 Java 11 或 8。等到 grails 更新到最新版本

Grails 所基于的 Spring-boot,最近 added support for JDK 14。 Grails 4.1.x 系列可能会支持 JDK 14。

【讨论】:

  • 我尝试了 11,也遇到了同样的问题。
  • 那么您的本地安装可能有问题,我刚刚验证它确实可以使用 11.0.7。
  • 我刚刚又试了一次。你是对的,它确实运行了,尽管有一个警告:``` $ grails create-app MyApp 警告:发生了非法反射访问操作警告:org.codehaus.groovy.vmplugin.v7.Java7$1 的非法反射访问(文件:/Users/a510523/work/software/grails-4.0.1/lib/org.codehaus.groovy/groovy/jars/groovy-2.5.6.jar) 到构造函数 java.lang.invoke.MethodHandles$Lookup(java .lang.Class,int) ... ```
  • 那么,回答我的问题 > 是否有已知可用于 Grails 4.X 的 JDK 列表?您提到 Grails 不支持 JDK14。你有参考吗?
  • Grails 4.0.x 基于不支持 JDK14 的 Spring-Boot 2.1.x。参考是上面链接中的 spring-boots 文档。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2017-06-10
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多