Groovy ShortTypeHandling ClassNotFoundException

时间:2014-05-24 15:25:00

标签: 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.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来解决这个问题,但这不会导致问题。

7 个答案:

答案 0 :(得分:21)

在groovy-all-2.3.0.jar中引入了ShortTypeHandling,因此快速解决方法是用groovy-all-2.3.0.jar替换旧的groovy-all-x.x.x.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类,并且一切都像以前一样工作。

答案 1 :(得分:19)

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

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

答案 2 :(得分:13)

我在更新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 - &gt;偏好 - &gt; Groovy - &gt;编译并单击&#34;切换到2.1.8.xx ...&#34;,在提示时重新启动Eclipse,并修复它。

答案 3 :(得分:7)

我通过在POM上添加这种依赖来解决这个问题:

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

然后,它就像一个魅力。

答案 4 :(得分:2)

Matthew Wise的解决方案为我工作,但除了重启eclipse之外,我还必须做一个项目 - &gt;清理它以使用新编译器重新编译。

(我会评论他的答案,但是堆栈溢出有这个愚蠢的规则,你可以评论,直到你获得更多的声誉)

答案 5 :(得分:2)

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

答案 6 :(得分:0)

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

Kuldeep Singh