40

由于升级到 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$3$1.run(CachedClass.java:84)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.reflection.CachedClass$3.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 安装。我已经删除了所有以前的版本(操作系统中的 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
4

10 回答 10

23

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

自最初发布以来,已经开发了一种解决方法。

aclement 在 3 月 5 日发表评论 这是构建: http://repo.spring.io/libs-snapshot-local/org/springframework/springloaded/1.2.2.BUILD-SNAPSHOT/springloaded-1.2.2.BUILD-SNAPSHOT。罐

要在 grails 下测试它,我要做的是进入 grails 文件夹:grails-2.5.0/lib/org.springframework/springloaded/jars

然后我重命名那里的弹簧加载罐,并将符号链接放入上面的罐子。过去你可以只修改 startGrails 脚本以指向新版本,但现在由于分叉,我发现你需要做符号链接的事情。或者将该 jar 放入此文件夹并重命名以匹配 grails 的期望(将其从 springloaded-1.2.2.BUILD-SNAPSHOT.jar 重命名为 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%;
于 2015-03-05T21:15:06.383 回答
21

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

于 2015-03-05T21:16:51.387 回答
19

我将我的 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 jars(我也删除了 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 )

于 2015-03-30T16:46:09.750 回答
11

第1步:下载这个jar

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

应该够了,重启IDE

于 2015-11-27T09:23:47.077 回答
6

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

于 2015-03-11T00:28:32.723 回答
4

我正在运行 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)
于 2015-03-06T16:42:02.593 回答
2

来自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

于 2015-06-09T14:58:24.620 回答
1

在我的 pom.xml 中更改 springloaded 版本就可以了。

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

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

于 2016-06-27T15:28:39.113 回答
1

两步让它工作

1.下载JDK低版本:从链接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"

于 2016-04-12T18:04:56.853 回答
0

我想我应该在这个话题上加上我的两便士。最近我在尝试将一个古老的应用程序升级到 2.4.4 时遇到了同样的问题。我发帖的原因是因为上述所有说明都有些过时了,虽然在大多数情况下它可能看起来有效。当您引入 mysql 驱动程序时,上述所有版本的 spring 加载都会在尝试触发数据库时遇到一个新问题,即不兼容和非 root。

我让 ggts 完全使用 JDK 1.8_065。为了使它起作用,请获取springloaded-1.2.5.RELEASE.jar将其放入grails-2.4.4/lib/org.springframework/springloaded/jars/文件夹中。当您在 ggts-bundle 文件夹中安装 ggts 时,就是 grails-2.4.4。因此,将文件放在 ggts-bundle 文件夹中的上述位置。除非你改变了配置。
重新启动 GGTS 我花了很长时间在它上面,并认为我应该更新说明。

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

grails.project.fork = []

在我的 BuildConfig.groovy

于 2015-12-21T19:20:34.483 回答