Apache 轴日志记录 - 在 Jira 插件中使用时出现 ClassCastException
Posted
技术标签:
【中文标题】Apache 轴日志记录 - 在 Jira 插件中使用时出现 ClassCastException【英文标题】:Apache axis logging - ClassCastException while using it inside a Jira plugin 【发布时间】:2012-07-28 11:47:05 【问题描述】:我的 Jira 5.0 插件已损坏,但出现以下异常:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused by: java.lang.ExceptionInInitializerError
at org.apache.axis.description.OperationDesc.<clinit>(OperationDesc.java:65)
at com.xyz.germander.AddTestTrackLinkDialogAction.doConfirm(AddTestTrackLinkDialogAction.java:23)
... 148 more
Caused by: java.lang.ClassCastException: org.apache.commons.logging.impl.SLF4JLogFactory cannot be cast to org.apache.commons.logging.LogFactory
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
... 150 more
作为参考,这是抛出 ClassCastException 的方法:
private static final org.apache.commons.logging.LogFactory getLogFactory()
return (org.apache.commons.logging.LogFactory)
AccessController.doPrivileged(
new PrivilegedAction()
public Object run()
return DiscoverSingleton.find(org.apache.commons.logging.LogFactory.class,
org.apache.commons.logging.LogFactory.FACTORY_PROPERTIES,
org.apache.commons.logging.LogFactory.FACTORY_DEFAULT);
);
... 为进一步参考,org.apache.commons.logging.LogFactory.FACTORY_DEFAULT 是“org.apache.commons.logging.impl.LogFactoryImpl”,FACTORY_PROPERTIES 应该是要搜索的属性文件的名称因为,在我的 org.apache.commons.logging jar 中是“commons-logging.properties”。
我尝试在插件的资源目录中创建一个 commons-logging.properties 文件;该文件包含以下内容:
priority=1
org.apache.commons.logging.Log=org.apache.commons.logging.impl.LogFactoryImpl
... 但它似乎被忽略了,因为 getLogFactory() 仍然获得 SLF4JLogFactory 并且无法转换它。所以它看起来像:
此 commons-logging.properties 文件需要位于其他位置 我需要将日志记录类设置为其他类型 项目配置错误,可能是在 Jira 级别,也可能是插件,也可能是 Maven,或者......我什至不知道我很困惑,如果有任何指导,我将不胜感激。
有一个类似的问题here,除了海报在 getLogFactory 中从 org.apache.axis.attachments.AttachmentsImpl 而不是 org.apache.axis.description.OperationDesc 的初始化中得到相同的异常。 (也是一个 Confluence 插件,而不是 Jira。)但是没有人在那里回应。
【问题讨论】:
您是否能够在您的 Jira 插件中正确实现日志记录?我在这里有一个类似的问题answers.atlassian.com/questions/74097/… 当我在此处接受的答案中描述了轴时,它确实对我有用。 您能否提供一个可在您的插件中使用的日志记录代码的简单示例?与answers.atlassian.com/questions/74097/… 类似的东西? (我正在尝试解决) 当然。我现在正在度假,所以我手边没有,但我已经记下了要回来发布。 (我也会在 Atlassian Answers 上发帖,因为很多人似乎都遇到了问题。) 【参考方案1】:发现:Atlassian 分叉了轴库,而 Jira 现在使用的是 axis-1.3-atlassian-1,而不是 Apache 最新的 axis-1.4; axis-1.3-atlassian-1 使用 1.0.4 版本的 commons-logging,而不是像 axis-1.4 那样的 1.1.1。
将插件的依赖从axis-1.4更改为axis-1.3-atlassian-1解决了这个问题。我怀疑 SLF4JLogFactory 可以在 1.0.4 而不是 1.1.1 中转换为 org.apache.commons.logging.LogFactory,但我还没有测试过。
如果在 Jira 中,请确保将依赖项的范围指定为“已提供”,否则您会因为内容被加载两次而遇到问题。这是一个 pom sn-p:
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.3-atlassian-1</version>
<scope>provided</scope>
</dependency>
【讨论】:
【参考方案2】:仅包含axis-1.3-atlassian-1的结果
java.lang.ClassNotFoundException: org.apache.axis.transport.http.AdminServlet
由于我的应用程序需要 AdminServlet,它包含在 appache 轴库中。 最后,当我将两者都包含在内时,它对我来说很好。
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.3-atlassian-1</version>
<scope>provided</scope>
</dependency>
【讨论】:
这很有趣。我想知道为什么 atlassian 会忽略 AdminServlet?以上是关于Apache 轴日志记录 - 在 Jira 插件中使用时出现 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章