【问题标题】:Groovy ShortTypeHandling ClassNotFoundExceptionGroovy ShortTypeHandling ClassNotFoundException
【发布时间】:2015-10-06 23:06:15
【问题描述】:

我有一个使用 groovy 版本 2.2.1 的 groovy 应用程序。我的 groovy 应用程序之前运行良好,但最近开始抛出此异常:

    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at com.app.Main.main(Main.groovy:83)Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

直到 groovy 2.3.0 才引入 ShortTypeHandling 类。如何在运行 2.2.1 版的 groovy 应用程序中引用它?我可以通过在我的 pom 中用 groovy-all-2.3.0.jar 替换 groovy-all-2.2.1.jar 来解决这个问题,但这并不是问题的根源。

【问题讨论】:

  • 我刚开始使用 Grails 2.4,它使用 groovy 2.3.0,当我将项目转移到使用 Maven 插件时遇到了 ShortTypeHandling ClassNotFoundException。这也是我第一次遇到这个问题,我还没有完全确定来源。我怀疑 groovy 2.3.0 可能是通过您的插件依赖项之一进入的?您最近是否添加了新的或升级了一个?你用的是什么版本的maven插件?
  • 我认为它必须是一个 mvn 依赖项,它也引入了 groovy-all-2.3.0 jar。我在整个 pom 上做了一个 mvn 依赖树(mvn dependency:tree -Dverbose),没有看到任何对 groovy 2.3.0 的引用。最后一件事,该应用程序在 Intellj 中运行时运行良好(它没有 groovy 2.3.0 依赖项)。只有当我通过 mvn 命令行编译/打包/运行时,问题才会出现。
  • 对不起,你问的是版本,我使用的是 groovy-eclipse-compiler v2.7.0。自应用停止工作以来唯一添加的新插件是测试代码覆盖率插件 cobertura-maven-plugin v2.6

标签: groovy


【解决方案1】:

ShortTypeHandling 是在 groovy-all-2.3.0.jar 中引入的,因此快速解决方法是将旧的 groovy-all-x.x.x.jar 替换为 groovy-all-2.3.0.jar。这解决了运行时 ShorTypeHandling ClassNotFoundException,但通过在应用程序中引入新的 groovy-all.jar 依赖项也产生了新问题。

真正的问题是如何通过 maven 调用 groovy 编译器。因为我引入了需要 groovy 2.0 的 spock,所以我需要更新 groovy-eclipse-compiler 依赖项的 maven 条目。以下是用于 groovy 2.x 的更新的 maven 条目:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <compilerId>groovy-eclipse-compiler</compilerId>
                <!-- Java version -->
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy-eclipse-compiler</artifactId>
                    <version>2.8.0-01</version>
                </dependency>
                <dependency>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy-eclipse-batch</artifactId>
                    <!-- Groovy version -->
                    <version>2.1.8-01</version>
                </dependency>
            </dependencies>
        </plugin>

有了这个,我可以将我的 groovy-all 依赖项保留为我最初对工作/经过全面测试的应用程序的依赖方式,如下所示:

    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <!-- If possible, its better if this matches 2.1.8 in the plugin definition -->
        <!-- but 2.2.1 worked fine here and allowed me to keep the original pom definition  -->
        <version>2.2.1</version>
    </dependency>

应用程序运行时不再引用 ShortTypeHandling 类,一切都像以前一样工作。

【讨论】:

【解决方案2】:

你必须添加(如果你使用 Gradle)

compile 'org.codehaus.groovy:groovy-backports-compat23:2.4.5'

【讨论】:

    【解决方案3】:

    我刚刚在 Eclipse 中更新了 groovy-eclipse 功能后得到了这个(为了尝试修复由https://jira.codehaus.org/browse/GRECLIPSE-1519 引起的间歇性保存问题)。特别是在我的情况下,我的 Groovy JUnit 测试抛出了这个异常。

    根据上述建议,我检查了我的 Eclipse 设置,它使用的是 Groovy 2.3.4.xx,而我的 Maven POM 指定的是 2.1.8.xx。我转到 Window -> Preferences -> Groovy -> Compiler 并单击“切换到 2.1.8.xx ...”,在出现提示时重新启动 Eclipse,这解决了它。

    【讨论】:

    • 我为此苦苦挣扎了很久!你的帖子就是票。谢谢!
    【解决方案4】:

    我通过在我的 POM 上添加此依赖项解决了这个问题:

    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy-backports-compat23</artifactId>
      <version>2.4.5</version>
    </dependency>
    

    然后,它就像一个魅力。

    【讨论】:

      【解决方案5】:

      Matthew Wise 的解决方案对我有用,但除了重新启动 eclipse 之外,我还必须执行一个项目 -> clean 以便它使用新编译器重新编译。

      (我本来会对他的回答发表评论,但堆栈溢出有一条愚蠢的规则,即在获得更多声誉之前你不能发表评论)

      【讨论】:

        【解决方案6】:

        我在我们的项目中遇到了类似的问题。令人惊讶的是,groovy 版本不是问题。 我正在使用旧版本的 gradle 构建项目,而不是项目的预期 gradle 版本。这解决了错误。

        【讨论】:

          【解决方案7】:

          在您的 pom.xml 中添加以下依赖项

               <dependency>
                  <groupId>org.codehaus.groovy.maven.runtime</groupId>
                  <artifactId>gmaven-runtime-default</artifactId>
                  <version>1.0-rc-3</version>
                  <exclusions>
                      <exclusion>
                          <groupId>org.codehaus.groovy</groupId>
                          <artifactId>groovy-all</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
          

          库尔迪普·辛格

          【讨论】:

            猜你喜欢
            • 2014-07-23
            • 2015-06-18
            • 1970-01-01
            • 1970-01-01
            • 2020-07-24
            • 2023-03-16
            • 2018-12-23
            • 2021-03-22
            相关资源
            最近更新 更多