Java 速度初始化错误:AvalonLogSleet未实现LogSleet

Java 速度初始化错误:AvalonLogSleet未实现LogSleet,java,classloader,velocity,Java,Classloader,Velocity,我试图初始化VelocityEngine,但在.init()调用时出现异常: org.apache.velocity.exception.VelocityException: The specified logger class org.apache.velocity.runtime.log.AvalonLogChute does not implement the org.apache.velocity.runtime.log.LogChute interface. 我的代码如下所示: Ve

我试图初始化
VelocityEngine
,但在
.init()
调用时出现异常:

org.apache.velocity.exception.VelocityException: The specified logger
class org.apache.velocity.runtime.log.AvalonLogChute does not
implement the org.apache.velocity.runtime.log.LogChute interface.
我的代码如下所示:

VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(....) //I do not change logging properties
...
velocityEngine.init();
依赖关系树中没有第二个velocity jar。但是有一个ApacheClickJAR,据我所见,它包含了自己的Velocity实现,或者至少是其中的一部分

所以看起来像是类加载器的问题。 我在这里找到了临时解决办法:


但是我想知道是否有任何方法可以在不替换线程类加载器的情况下解决这个问题。

在单击jar的内部,您有velocity.properties
org\apache\velocity\runtime\defaults\

您可以通过三种方式:

现有Log4j记录器

从1.3版开始,Velocity将记录 将其输出到中其他位置的现有Log4j记录器设置 应用要使用此功能,必须确保log4jjar 在您的类路径中。(因为您正在使用 Log4j在应用程序中使用Velocity。)将Velocity配置为使用 通过指定现有记录器的名称来创建log4jlogsleet类 通过“runtime.log.logsystem.log4j.logger”属性使用。注 Velocity的1.5版中提供了对记录器的支持。进一步的 在版本1.5中,我们删除了现在非常古老且不推荐的原始版本 Log4JLogSystem类,并替换为当前Log4JLogSystem类 它使用Logger类。我们为造成的混乱道歉,但我们 需要继续前进

自定义独立记录器

您可以创建一个自定义 日志类-您只需要实现接口 org.apache.velocity.runtime.log.logsleet,然后只需设置 具有类名的配置属性runtime.log.logsystem.class, Velocity将在初始化时创建该类的实例。你 可以在指定任何其他属性时指定类名。见 有关Velocity助手类以及配置的信息 键和值。请注意,旧的 org.apache.velocity.runtime.log.LogSystem接口已被删除 v1.5版已弃用,支持新的日志滑槽接口。这是 由于对我们的日志代码进行了重大升级,因此 由LogSystem接口支持。但如果你具体说明的话,别担心 一个实现LogSystem接口的自定义类,它仍然 工作但是,它将生成弃用警告。你应该 升级您的自定义记录器以尽快实施日志滑槽

集成日志记录

您可以集成Velocity的日志功能 使用现有的日志系统,只需实现 org.apache.velocity.runtime.log.logsleet接口。然后,通过一个 通过 初始化前的runtime.log.logsystem配置密钥 Velocity引擎,Velocity会将消息记录到应用程序的 记录器。请参见有关Velocity助手类的信息以及 配置键和值

当前运行时日志:

runtime.log.logsystem.class = org.apache.velocity.runtime.log.AvalonLogChute,org.apache.velocity.runtime.log.Log4JLogChute,org.apache.velocity.runtime.log.CommonsLogLogChute,org.apache.velocity.runtime.log.ServletLogChute,org.apache.velocity.runtime.log.JdkLogChute

@user7294900正如我已经写过的,在类路径中没有其他velocity版本。然而,ApacheClick包含一些velocity类,它们的名称和包与velocity jar中的相同,但它不是一个单独的库,它位于ApacheClicks jar中。不幸的是,我不能排除ApacheClickJAR。我不确定这会有什么帮助?问题是有两个logsleet接口,一个在apacheclick中,另一个在velocity中,它们相互冲突