2013-11-13 1 views
0

(Моя вторая проблема Gradle ...)gradle NoSuchMethodError: org.apache.log4j.PatternLayout. <init> (Ljava/языки/String;)

Я пытаюсь настроить вызов скорости в одной из моих задач. Velocity делает прямой вызов log4j, который Gradle каким-то образом переводит в свой log4j-over-slf4j-1.7.2.jar, вызывая NoSuchMethodError.

Так у меня есть:

buildscript { 
    repositories { 
     mavenLocal() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'org.apache.velocity:velocity:1.7' 
     // ... asumes provided: 
     classpath 'log4j:log4j:1.2.12' 
    } 
} 

А потом в задаче я ...

def template = Velocity.getTemplate('src\\jnlp\\jnlpTemplate.vm') 

Это вызывает исключение. И последняя часть StackTrace является

Caused by: java.lang.NoSuchMethodError: org.apache.log4j.PatternLayout.<init>(Ljava/lang/String;)V 
     at org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:117) 
     at org.apache.velocity.runtime.log.Log4JLogChute.init(Log4JLogChute.java:85) 
     at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157) 
     at org.apache.velocity.runtime.log.LogManager.updateLog(LogManager.java:269) 
     at org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:871) 
     at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:262) 
     at org.apache.velocity.runtime.RuntimeInstance.requireInitialization(RuntimeInstance.java:302) 
     at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1531) 
     at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1514) 
     at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:299) 
     at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:358) 
     at org.apache.velocity.app.Velocity$getTemplate.call(Unknown Source) 
     at build_49a099islbrnod06rkiudfavms$_run_closure1.doCall(C:\home\...\build.gradle:67) 

Мой анализ до сих пор выглядит следующим образом:

Конструктор PatternLayout (String), который вызывается Velocity является частью класса PatternLayout LOG4J, но это, кажется, Gradle завершает решение PatternLayout для класса в $ GRADLE_HOME/lib/log4j-over-slf4j-1.7.2.jar. И этот шаблон PatternLayout кажется очень минимальной версией, в которой отсутствует запрошенный конструктор.

Есть ли какое-нибудь обходное решение здесь? Я допустил ошибку начинающих?

ответ

0

Вы должны удалить банку log4j из своего приложения: мост log4j-over-slf4j и log4j имеют те же методы с одной и той же сигнатурой (могут возникнуть некоторые проблемы, вызванные различным порядком загрузки в пути к классам). Если вы хотите использовать мост, вам не нужен log4j lib, вам нужно выбрать другую структуру ведения журнала, которая реализует slf4j (например, обратная связь).

Это может быть проблема с версией. Версия 1.7.2 моста может быть слишком высокой, попробуйте перейти на более низкую версию.

+0

(Извините за поздний отклик, у другой работы был приоритет.) –

+0

(2-я попытка добавить комментарий.) Я добавил зависимость log4j, потому что это то, чего хочет скорость. Его скорость, которая вызывает метод, который находится в log4j, но не в мосту log4j-over-sl4j. Если я удалю зависимость log4j, тогда скорость все равно хочет вызвать метод, который все еще не находится в банке моста. Проблема заключается в том, что «полный» log4j и «мост» не имеют одинаковых методов. В частности, его конструктор PatternLayout (String), отсутствующий в последнем. –