2013-11-26 3 views
1

Я работаю над программой, которая использует cglib, входящую в состав большого пакета зависимостей (версия 2.1_3), и написала новую функцию с использованием обработанного процессором процессора, чтобы сделать некоторую уценку для преобразования html ,Конфликт конфликтующих с конфликтами и Cglib

Проблема возникает с конфликтом зависимости. Если я ничего не делаю, все мои тесты для пропаренных функций терпят неудачу, с сообщениями по линиям:

java.lang.IncompatibleClassChangeError: org/parboiled/transform/ParserClassNode 

И если я включаю следующее исключение

<exclusion> 
    <groupId>asm</groupId> 
    <artifactId>asm</artifactId> 
</exclusion> 

где объявлена ​​моя большую зависимость , все тесты пропаренный будет проходить, но большинство других не получится, с сообщениями, как

Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer 

Я использую pegdown 1.4.1

Любые предложения? Просмотр Интернета, похоже, предполагает использование новой версии asm (4.0 или новее, то, что в моем проекте на данный момент равно 1.5.3) может помочь, но попытка исключить asm, который у меня есть, и импортировать более позднюю, не помогла ,

ответ

1

Проблема в том, что cglib трудно переносить. Это происходит потому, что:

  • новой CGLIB версия не совместима с их более ранними версиями
  • новых ASM версии не совместимы с их более ранними версиями (CGLIB построен на вершине ассемблера)

FAQ to ASM поэтому рекомендует:

Как разрешить конфликты между различными API ASM версии доступны в глобальном пути к классам или в пределах одного ClassLoader?

инструменты и механизмы, которые используют ASM для обработки байт-кода (например, Hibernate, CGLIB, AspectWerkz) должны переупаковки код ASM в их собственное пространство имен. Это можно автоматизировать с помощью инструмента Jar Jar Links.

Я рекомендую вам сделать то же самое с cglib. Переместите всю зависимость в новый пакет (создайте независимое пространство имен) и используйте эту зависимость. Это уродливо, но это единственное решение. Другие проекты, такие как Spring или Hibernate, обрабатывают cglib таким же образом.

Смежные вопросы