log4j - gradle NoSuchMethodError:org.apache.log4j.PatternLayout。<init>(Ljava/lang/String;)

标签 log4j gradle velocity slf4j nosuchmethoderror

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

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

最佳答案

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

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

关于log4j - gradle NoSuchMethodError:org.apache.log4j.PatternLayout。<init>(Ljava/lang/String;),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19960865/

相关文章:

java - 如何使用 log4j 关闭注销?

java - 电锯 v2 中的存储大小

gradle - Gradle 中的 JUnit 监听器配置

gradle - 将其他源集添加到 Gretty 类路径

java - 将类添加到最后一个菜单项的速度语句?

java - 速度,不同的模板路径

java - 如何在vm文件中选择$date的格式?

java - 使 log4j 可加性等于 true 或 false 的结果是什么?

java - 使用gradle构建spring3框架失败

java - Ant 测试任务期间如何登录控制台