Не найдено подходящего загрузчика классов для захвата - PullRequest
18 голосов
/ 06 января 2011

У меня есть это в начале класса:

@Grab(group = 'org.ccil.cowan.tagsoup', module = 'tagsoup', version = '1.2')
class MyClass{...

Я пытаюсь выполнить модульное тестирование этого класса, но всякий раз, когда я пытаюсь запустить тесты JUnit 4, я получаю эту ошибку:

Caused by: java.lang.RuntimeException: No suitable ClassLoader found for grab
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:198)
    at groovy.grape.GrapeIvy.chooseClassLoader(GrapeIvy.groovy:163)
    at groovy.grape.GrapeIvy$chooseClassLoader.callCurrent(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
    at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:227)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:225)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153)
    at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:216)
    at groovy.grape.Grape.grab(Grape.java:131)
    at groovy.grape.Grape$grab.callStatic(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:165)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:173)
    at ammoscanner.AmmoScanner.<clinit>(AmmoScanner.groovy)
    ... 30 more

Есть идеи? Я использую Groovy 1.7.5

Ответы [ 6 ]

5 голосов
/ 31 октября 2014

Проблема

Глядя на исходный код , это исключение выдается, когда имя предоставленного ClassLoader (или его суперкласса) не равно groovy.lang.GroovyClassLoader или org.codehaus.groovy.tools.RootLoader. Т.е. целевой загрузчик классов должен быть экземпляром вышеупомянутых классов (немного ограничивающий ИМХО).

Решение

В настоящее время я не знаю, как настроить определенный загрузчик классов, используя аннотации @Grape / @Grab / @GrabConfig. Наиболее близким было бы использовать @GrabConfig(systemClassLoader=true) и убедиться, что системный загрузчик классов является экземпляром одного из вышеупомянутых классов ClassLoader.

Если кто-нибудь знает, пожалуйста, дайте мне знать (и я обновлю этот ответ).

Обходной путь

Следующий код программно загрузит ваш Grapes и загрузит его в прилагаемый GroovyClassLoader (правда, не совсем то, что вы хотите).

def loadGrapes(){
    ClassLoader classLoader = new groovy.lang.GroovyClassLoader()
    Map[] grapez = [[group : 'org.ccil.cowan.tagsoup', module : 'tagsoup', version : '1.2']]
    Grape.grab(classLoader: classLoader, grapez)
    println "Class: " + classLoader.loadClass('org.ccil.cowan.tagsoup.jaxp.SAXParserImpl')
}
5 голосов
/ 27 января 2011

Использование @Grab делает код непроверенным, по крайней мере, с 01/26/2011.

2 голосов
/ 10 января 2011

Я полагаю, вы пытались добавить

@GrabConfig(systemClassLoader=true)

вроде так:

@Grapes([
    @Grab(group = 'org.ccil.cowan.tagsoup', module = 'tagsoup', version = '1.2'),
    @GrabConfig( systemClassLoader=true )
])
class MyClass{...
1 голос
/ 09 апреля 2012

Если вы не используете systemClassLoader = true, то, похоже, ваша IDE не запускает код с помощью Groovy-компилятора, вы можете проверить это с помощью простого класса Groovy, который выводит имя класса своего загрузчика классов. Я предполагаю, что он пытается скомпилировать классы groovy и запустить их с загрузчиком классов без groovy.

См. Также этот ответ на общую ошибку при преобразовании: не найден подходящий ClassLoader для захвата . Также это сообщение в блоге объясняет больше о запуске предварительно скомпилированных классных классов с помощью стандартного загрузчика классов.

0 голосов
/ 12 февраля 2018

Есть еще одно решение для тестирования класса с аннотацией @Grab:

  1. Извлечение интерфейса из этого класса.
  2. Создайте другой класс, который реализует его интерфейс. Переместите аннотацию @Grab в этот класс. Затем сделайте этот класс простой оболочкой, которая просто передает все сообщения исходному классу.
  3. Запустите тесты против вашего исходного класса.
  4. Если вам нужна версия @Grab, используйте обертку.
0 голосов
/ 01 июля 2013

Добавьте сайт обновления снимка плагина для Kepler.

Похоже, это решает проблему "..не подходящего загрузчика классов". К сожалению, после этого мне все еще пришлось добавить репозиторий винограда в classpath для проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...