【问题标题】:Incompatible JVM in GGTS (Eclipse) and JAVA 1.8GGTS (Eclipse) 和 JAVA 1.8 中不兼容的 JVM
【发布时间】:2015-05-06 23:53:11
【问题描述】:

由于升级到 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

【问题讨论】:

  • 看起来您正在 Java 1.8 更新 40 中进行更改,不再允许此代码尝试执行的操作
  • 我不喜欢任何需要降级 Java 更新的解决方案。更新是有原因的(有时与安全相关),应该避免倒退,尤其是在生产环境中。下面有一个不需要降级Java版本的解决方案。

标签: java eclipse ggts


【解决方案1】:

版本 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.jar

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

然后我重命名那里的弹簧加载 jar 并放入符号链接 到上面的罐子里。以前你可以只修改 startGrails 脚本指向新版本,但现在由于 分叉我发现你需要做符号链接的事情。或者把那个罐子扔进 这个文件夹并重命名它以匹配 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%;

【讨论】:

【解决方案2】:

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

【讨论】:

  • 对不起,如果这似乎是一个愚蠢的问题,但是你能在 ubuntu 中转到旧版本吗?
  • 现在有一个更新 springload jar 的解决方法。
  • 版本倒退是可悲的。其他解决方案可用。
【解决方案3】:

我正在运行 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)

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我将 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

      【讨论】:

      • GGTS 有一个 Grails 的捆绑版本。在另一个目录中重复该解决方案,例如 /Applications/ggts-bundle//grails-2.4.4/lib/org.springframework/springloaded/jars/
      • 我也确认:springloaded-1.2.5
      • 它有效。但不要忘记:将新 JAR 重命名为旧 JAR 的文件名(例如:springloaded-1.2.1.RELEASE.jar) b.清理你的项目
      • 请不要将 jar 重命名为不同的版本号。一定有更好的办法。
      • 这是最好的答案,因为它 1) 不建议降级您的 Java 版本,并且 2) 包含指向最新版本的实时存储库的链接(企鹅的答案中链接到的 1.2.2 版本)不适用于 Java 版本 1.8.0_92)。但是应该提到新的 JAR 需要重命名以匹配旧 JAR 的版本号。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        第 1 步:下载此jar

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

        应该够了,重启IDE

        【讨论】:

        • 最后我的项目运行但不正常。给出了很多警告。
        【解决方案8】:

        我想我应该在这个话题上加上我的两便士。最近我在尝试将一个古老的应用程序升级到 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 中

        【讨论】:

          【解决方案9】:

          两步搞定

          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" .

          【讨论】:

            【解决方案10】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-11-21
              • 2021-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-28
              • 1970-01-01
              相关资源
              最近更新 更多