Apache轴日志记录 - 在Jira插件中使用它时的ClassCastException

时间:2012-07-30 18:53:39

标签: axis jira-plugin apache-commons-logging atlassian-plugin-sdk

我的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应该是要搜索的属性文件的名称for,在我的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,除了海报在org.apache.axis.attachments.AttachmentsImpl的初始化而不是org.apache.axis.description.OperationDesc的getLogFactory中获得了相同的异常。 (也是一个Confluence插件,而不是Jira。)但是没有人回应。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

发现:Atlassian分叉轴库,Jira现在使用axis-1.3-atlassian-1而不是Apache的最新轴-1.4; axis-1.3-atlassian-1使用1.0.4版本的commons-logging,而不是1.1.1版本的axis-1.4。

更改插件从axis-1.4到axis-1.3-atlassian-1的依赖性解决了这个问题。我怀疑SLF4JLogFactory可以在1.0.4但不是1.1.1中转换为org.apache.commons.logging.LogFactory,但我还没有测试过它。

如果在Jira中,请确保将依赖关系的范围指定为“已提供”,否则您将因为两次加载内容而遇到问题。这是一个pom片段:

    <dependency>
        <groupId>axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.3-atlassian-1</version>
        <scope>provided</scope>
    </dependency>