КлассCircularityError, созданный ClassLoader.defineClass

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

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

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

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

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