Подтвердить что ты не робот

Groovy ShortTypeHandling ClassNotFoundException

У меня есть приложение groovy, которое использует groovy версию 2.2.1. Мое приложение 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. Как это можно сделать в groovy приложении с версией 2.2.1? Я могу решить эту проблему, заменив groovy -all-2.2.1.jar на groovy -all-2.3.0.jar в моем pom, но это не вызвало проблемы.

4b9b3361

Ответ 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. Поскольку я ввел spock, который требовал groovy 2.0, мне нужно было обновить записи maven для зависимости groovy -eclipse-компилятора. Ниже приведены обновленные записи maven для работы с groovy 2.x:

        <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

У меня только что появилось это после обновления функции groovy -eclipse в 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 мне также пришлось выполнить проект → чистый, чтобы он перекомпилировал новый компилятор.

(Я бы прокомментировал его ответ, но переполнение стека имеет это глупое правило, которое вы не можете комментировать, пока не получите больше репутации)

Ответ 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>

Кулдеп Сингх