ClassCircularityError, брошенный ClassLoader.defineClass - PullRequest
11 голосов
/ 30 мая 2011

Я загружаю классы, используя пользовательский загрузчик классов.По большей части все работает, но иногда, когда я загружаю особенно сложные проекты / библиотеки, я получаю странную ошибку:

Exception in thread "main" java.lang.ClassCircularityError: 
  org/apache/commons/codec/binary/Hex
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
    at my.custom.class.Loader.loadClass(...)

Глядя на Javadocs, я не ожидаю, что defineClass выкинет этоконкретная ошибка.org/apache/commons/codec/binary/Hex это класс, который я пытаюсь загрузить.Это похоже на то, как если бы defineClass хочет получить копию класса, прежде чем он определит класс - что для меня не имеет смысла.

Идеи?

1 Ответ

13 голосов
/ 01 июня 2011

A ClassCircularityError генерируется, когда некоторый класс является (косвенным) суперклассом самого себя, некоторый интерфейс (косвенно) расширяет себя или подобное.

Это обычно не должно происходить, так как компилятор с хорошим поведением не будет создавать такие классы, но использование разных версий библиотеки (или использование нескольких библиотек, содержащих разные версии класса) может привести к этой проблеме.

Сканируйте ваши библиотеки на наличие двойных имен классов, в частности, посмотрите, есть ли несколько версий упомянутого org.apache.commons.codec.binary.Hex класса.

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