GGTS (Eclipse) 和 JAVA 1.8 中不兼容的 JVM

Incompatible JVM in GGTS (Eclipse) and JAVA 1.8

由于升级到 Java 1.8,运行在 GGTS (eclipse) 中安装 grails 应用程序时遇到一些问题。

堆栈开始于:

Mar 05, 2015 3:51:31 PM org.springsource.loaded.jvm.JVM copyMethod
SEVERE: Problems copying method. Incompatible JVM?
java.lang.reflect.InvocationTargetException
    at sun.reflect.GeneratedMethodAccessor91.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springsource.loaded.jvm.JVM.copyMethod(JVM.java:134)
    at org.springsource.loaded.ri.OriginalClassInvoker.createJavaMethod(OriginalClassInvoker.java:68)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlClassGetDeclaredMethods(ReflectiveInterceptor.java:151)
    at org.codehaus.groovy.reflection.CachedClass.run(CachedClass.java:84)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.reflection.CachedClass.initValue(CachedClass.java:81)
...
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)
    at org.codehaus.groovy.grails.cli.support.GrailsStarter.rootLoader(GrailsStarter.java:236)
    at org.codehaus.groovy.grails.cli.support.GrailsStarter.main(GrailsStarter.java:264)
Caused by: java.lang.IllegalArgumentException: Can not copy a non-root Method
    at java.lang.reflect.Method.copy(Method.java:151)
    ... 280 more

我曾经在 Java 1.7 中 运行 相同的应用程序。我的同事升级到 1.8 后无法再 运行 它了。

我用 SUN JDK 测试过,现在我又在 OpenJDK 上了,但这没有用 当前 JDK openjdk 版本“1.8.0_40”

JAVA_HOME、JAVA_PATH 和任何其他变量似乎都指向正确的 JDK 安装。我已经删除了之前的所有内容(OS 中的 JDK 1.6 & 1.7 以确保没有对它们的引用)。

出于某种原因,GGTS 仍然抱怨错误的 JVM。我知道该错误可能与试图在 1.8 中编译文件的编译器 1.7 有关,但我不确定此引用来自 eclipse 中的何处。

我的Eclipse安装信息在Java下列出如下:

-vm
/usr/lib64/jvm/jre-1.8.0-openjdk/bin/java
eclipse.home.location=file:/home/arb/dev/applications/ggts-3.6.3.SR1/
eclipse.launcher=/home/arb/dev/applications/ggts-3.6.3.SR1/GGTS
eclipse.launcher.name=GGTS
eclipse.p2.data.area=@config.dir/../p2
eclipse.p2.profile=DefaultProfile
eclipse.product=org.springsource.ggts.ide
eclipse.startTime=1425566898624
eclipse.stateSaveDelayInterval=30000
eclipse.vm=/usr/lib64/jvm/jre-1.8.0-openjdk/bin/java
eclipse.vmargs=-Dgrails.console.enable.interactive=false
-Dgrails.console.enable.terminal=false
-Djline.terminal=jline.UnsupportedTerminal
-Dgrails.console.class=grails.build.logging.GrailsEclipseConsole
-Dosgi.requiredJavaVersion=1.6
-Xms60m
-Xmx1024m

版本 1.8.0_40 和 1.8.0_45 对 grails 进行了重大更新。 Spring不能复制非Root方法。

自最初发布以来,已经制定了解决方法。

aclement commented on Mar 5 Here is the build: http://repo.spring.io/libs-snapshot-local/org/springframework/springloaded/1.2.2.BUILD-SNAPSHOT/springloaded-1.2.2.BUILD-SNAPSHOT.jar

To test it under grails, what I do is go into the grails folder: grails-2.5.0/lib/org.springframework/springloaded/jars

I then rename the spring loaded jar that is there and put in a symlink to the jar above. It used to be that you could just modify the startGrails script to point to the new version, but now due to the forking I find you need to do the symlink thing. Or drop that jar into this folder and rename it to match the expectations of grails (rename it from springloaded-1.2.2.BUILD-SNAPSHOT.jar to springloaded-1.2.0.RELEASE.jar)

如果您想回滚

1.8.0_25、1.8.0_31

原生支持 Grails

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u25-oth-JPR

一旦你有了兼容的 java 版本,清理你的 grails 项目。 确保您的 java 路径变量设置为指向您的预期版本。

set JAVA_HOME=C:\java\jdk1.8.0_25
set PATH=%JAVA_HOME%\bin;%PATH%;

是jdk8u40相关的问题,回jdku31。它适用于该版本。 我 运行 在 windows 和 linux 环境中遇到同样的问题。

我是 运行 Grails 2.4.3,从 jdk1.8.0_31 迁移到 jdk1.8.0_40 也有问题,不得不回到 jdk1.8 .0_31

Loading Grails 2.4.3
...
SEVERE: Problems copying method. Incompatible JVM?
java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.IllegalArgumentException: Can not copy a non-root Method
at java.lang.reflect.Method.copy(Method.java:151)

根本原因、解决方法和有关修复的新闻:https://github.com/spring-projects/spring-loaded/issues/98

我将我的 springloaded jar 更新到版本 1.2.4.BUILD-SNAPSHOT(从 1.2.1 开始)并解决了这个问题。 (最新版本可以在Spring repo中找到)

  1. 转到您本地的 Grails lib 目录以查找 springloaded jar。对我来说那是 /usr/local/Cellar/grails/2.4.4/libexec/lib/org.springframework/springloaded/jars/
  2. 删除现有的 1.2.1 jar(我也删除了 pom 文件,但不是必需的)
  3. 下载最新的 springloaded jar 并放入 jars 子目录: wget http://repo.spring.io/libs-snapshot-local/org/springframework/springloaded/1.2.4.BUILD-SNAPSHOT/springloaded-1.2.4.BUILD-SNAPSHOT.jar

这样做之后,一切正常。 (从以前的答案中使用的线索:https://github.com/spring-projects/spring-loaded/issues/98

来自 https://github.com/spring-projects/spring-loaded/issues/98 并为我工作

wget repo.spring.io/libs-snapshot-local/org/springframework/springloaded/1.2.3.BUILD-SNAPSHOT/springloaded-1.2.3.BUILD-SNAPSHOT.jar -O ~/.gvm/grails/2.4.4/lib/org.springframework/springloaded/jars/springloaded-1.2.1.RELEASE.jar

第 1 步:下载此 jar

第2步:放入grails文件夹:grails-2.4.1/lib/org.springframework/springloaded/jars

应该够了,重启IDE

我想我应该在这个话题上加两便士。最近我在尝试将一个古老的应用程序升级到 2.4.4 时遇到了同样的问题。我的 post 的原因是因为上面的所有说明都有点过时了,而在大多数情况下它似乎可以工作。在您引入 mysql 驱动程序的那一刻,所有上述 spring 版本的驱动程序在尝试触发数据库时遇到了一个关于不兼容和非 root 的新问题。

我让 ggts 完全与 JDK 1.8_065 一起工作。要使其正常工作,请将 springloaded-1.2.5.RELEASE.jar 放入 grails-2.4.4/lib/org.springframework/springloaded/jars/ 文件夹中。 当你安装 ggts 里面的 ggts-bundle 文件夹是 grails-2.4.4。所以将文件放在 ggts-bundle 文件夹中的上述位置。除非你更改了配置。
重新启动 GGTS 我花了很长时间,认为我应该更新说明。

我遇到的另一件事是在升级后在 grails 2.4.4 下分叉并最终设置

grails.project.fork = []

在我的BuildConfig.groovy

两步让它发挥作用

1.下载JDK低版本: 从 link http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u25-oth-JPR 安装 jdk1.8.0_25。它是 JDK 的较低版本,因为 grails 不支持较高版本。也许他们很快就会将其包含在最新版本中。

2。设置环境变量: 不要忘记更改 jdk 的环境变量,您只需将路径变量和 JavaHome 变量从 "C:\Program Files\Java\jdk1.8.0_'LatestVersion'" 编辑为 "C:\Program Files\Java\jdk1.8.0_25"

在我的 pom.xml 中更改 springloaded 版本就成功了。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
    <version>1.2.6.RELEASE</version>
</dependency>

当我遇到这个问题时,我的 springloaded 版本是 1.2。1.RELEASE