0

(我的第二个 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 似乎是一个非常小的实现,缺少请求的构造函数。

这里有一些解决方法吗?我犯了一些初学者的错误吗?

4

1 回答 1

0

您必须从您的应用程序中删除 log4j jar:桥 log4j-over-slf4j 和 log4j 具有相同的方法,具有相同的签名(可能由于类路径的加载顺序不同而导致一些问题)。如果您想使用不需要 log4j 库的桥接器,则必须选择另一个实现 slf4j 的日志框架(例如 log-back)。

可能是版本问题。网桥的1.7.2版本可能太高,尝试降级到较低版本。

于 2013-11-15T09:10:03.467 回答