(我的第二个Gradle问题......)
我正在尝试在我的一项任务中设置对Velocity的调用。 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')
这引发了一个例外。堆栈跟踪的最后一部分是
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)
到目前为止,我的分析如下:
由Velocity调用的构造函数PatternLayout(String)是log4j的PatternLayout类的一部分,但似乎Gradle最终将PatternLayout解析为$ GRADLE_HOME / lib / log4j-over-slf4j-1.7.2.jar中的类。而jar的PatternLayout似乎是一个非常小的实现,缺少请求的构造函数。
这里有一些解决方法吗?我是否让一些初学者犯了错误?
答案 0 :(得分:0)
您必须从您的应用程序中删除log4j jar:桥接器log4j-over-slf4j和log4j具有相同的方法,具有相同的签名(可能存在由于在类路径中不同的加载顺序而导致的一些问题)。如果你想使用你不需要log4j lib的桥,你必须选择另一个实现slf4j的日志框架(例如log-back)。
这可能是版本问题。桥的版本1.7.2可能太高,尝试降级到较低版本。