开发者社区> 问答> 正文

Tair日志库版本冲突

之前遇到了和帖子相同的问题:bbs.aliyun.com/read/283384.html
将slf4j版本改成1.5.5之后又出现了另一个问题:




stackoverflow上说是API更改的问题:stackoverflow.com/questions/20088650/exception-in-java-project-java-lang-illegalaccesserror-tried-to-access-field-o


这是依赖:
<!--com.alibaba.middleware.race.jstorm-2.1.1版本默认的日志框架是logback,为了避免日志冲突,排除掉log4j-->
    <dependencies>

        <dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>3.2.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jdk14</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.jstorm</groupId>
            <artifactId>jstorm-core</artifactId>
            <version>2.1.1</version>
            <!--            跑jstorm本地测试或者本地需要kryo相关操作时,请将provided屏蔽,
                        提交到jstorm集群的时候,记得加上provided的-->
            <!--<scope>provided</scope>-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-nop</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jdk14</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.taobao.tair</groupId>
            <artifactId>tair-client</artifactId>
            <version>2.3.4</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.5</version>
        </dependency>

    </dependencies>


展开
收起
vcamx 2016-05-30 16:26:05 5261 0
3 条回答
写回答
取消 提交回答
  • ReTair日志库版本冲突
    按照你的叙述改的,又出现了:Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.LoggerFactory
    有人知道原因吗?
    2016-06-01 11:54:16
    赞同 展开评论 打赏
  • ReTair日志库版本冲突
    问题已解决
    在pom.xml中JStorm的exclusions中增加一个exclusion
    <exclusion>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
    </exclusion>


    2016-05-30 21:00:05
    赞同 展开评论 打赏
  • ReTair日志库版本冲突
    问题主要是由于jar包版本的升级致使API改变的。
    jstorm使用了logback的日志框架,而org.slf4j.impl.StaticLoggerBinder其实是在logback的jar包中ch.qos.logback: logback-classic:1.0.13.而SINGLETON在StaticLoggerBinder中是private的。

    而LoggerFactory在slf4j-api的jar包中,LoggerFactory调用了StaticLoggerBinder。下面是1.5.5的调用:

    logback的jar包版本比slf4j的要高(肯定不是同期的)。而在slf4j的1.7.5(官方的demo依赖的版本)版本中,LoggerFactory中相关的代码是被重写了(不知道那个版本开始被改的),可以去看下源码。所以解决这个问题要么不要使用1.5.5的依赖,要么把logback相关jar包版本替换成和1.5.5相对应的版本。可以去search.maven.org/查对应jar的时间。

    -------------------------

    回 1楼sxian的帖子
    丟了张图:
    2016-05-30 17:15:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_赖思超_PostgreSQL10_hash索引的WAL日志修改版final 立即下载
Kubernetes下日志实时采集、存储与计算实践 立即下载
日志数据采集与分析对接 立即下载