Groovy ShortTypeHandling类NotFoundException

Groovy ShortTypeHandling类NotFoundException,groovy,Groovy,我有一个使用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

我有一个使用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)

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

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

真正的问题是如何通过maven调用groovy编译器。因为我引入了需要groovy 2.0的spock,所以我需要更新groovy eclipse编译器依赖项的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>

org.apache.maven.plugins
maven编译器插件
3.1
groovy eclipse编译器
1.7
1.7
org.codehaus.groovy
groovy eclipse编译器
2.8.0-01
org.codehaus.groovy
groovy eclipse批处理
2.1.8-01
有了它,我可以让groovy完全依赖于我最初对工作/完全测试的应用程序的方式,如下所示:

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

org.codehaus.groovy
groovy all
2.2.1

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

我刚刚在eclipse中更新了groovy eclipse特性(为了尝试和修复由更新引起的间歇性保存问题),就遇到了这个问题。特别是在我的例子中,我的Groovy JUnit测试抛出了这个异常

根据上面的建议,我检查了我的Eclipse设置,它使用的是Groovy 2.3.4.xx,而我的Maven POM指定的是2.1.8.xx。我转到窗口->首选项->Groovy->编译器并单击“切换到2.1.8.xx…”,在出现提示时重新启动Eclipse,这就解决了问题。

您必须添加(如果您使用的是Gradle)


将以下依赖项添加到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>

org.codehaus.groovy.maven.runtime
gmaven运行时默认值
1.0-rc-3
org.codehaus.groovy
groovy all

Kuldeep Singh

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


(我会对他的答案发表评论,但stack overflow有一条愚蠢的规则,在你获得更多声誉之前,你不能发表评论)

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

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

org.codehaus.groovy
groovy-backports-compat23
2.4.5

然后,它就像一个魅力。

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

我刚开始使用使用groovy 2.3.0的Grails 2.4,当我将项目转移到使用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命令行编译/打包/运行时才会出现。自应用程序停止运行以来,唯一添加的新插件是测试代码覆盖率插件cobertura maven plugin v2.6。您可能会发现Guillaume的发布公告很有帮助:。他们引入了一个兼容性jar来添加这个类。我为此奋斗了很长时间!你的帖子就是票。非常感谢。
<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-backports-compat23</artifactId>
  <version>2.4.5</version>
</dependency>