zoukankan      html  css  js  c++  java
  • java 包冲突解决方法

    1、诊断包冲突

    java.lang.NoSuchMethodError: org.apache.commons.io.output.DeferredFileOutputStream.<init>(ILjava/lang/String;Ljava/lang/String;Ljava/io/File;)V


    2、解决

    2.1 可见的依赖冲突

    在eclipse中打开project,在pom文件的dependency hierarchy中,搜冲突的包commons-io,查看各依赖包的依赖信息。包有依赖冲突的话,会有显示xxx版本号与xxx版本号冲突。选择正确的版本号,将剩下的版本号在相应的引用包下exclusion掉。

    或者用 mvn dependency:tree > tree.log,将依赖信息导入文件tree.log中,查看包commons-io的依赖信息。

    假设运行失败,报错:outofMemery

    运行命令:

    set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m
    linux系统运行:
    export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
    然后再mvn dependency:tree > tree.log就可以。


    2.2 不可见的依赖冲突

    1)查看server使用的jboss路径下有没有包括冲突的包的其它版本号。

    路径是:jboss-x.x.x.GA/lib, 和 jboss-x.x.x.GA/server/default/lib ,假设里面有冲突的版本号。则删除。


    2)查看异常发生时,JVM载入的是哪个包。

    在程序启动的脚本中增加JVM启动參数 -verbose:class,然后重新启动应用。在启动日志中能够看到载入的类来自哪个包。

    [Loaded org.apache.velocity.runtime.parser.node.ASTTrue from file:/home/admin/app/.default/deploy/app.war/WEB-INF/lib/velocity-1.6.4.jar]

    假设在jboos的启动日志中没有发现载入冲突的类。可能是懒载入。
    运行触发异常的操作,再看jboss的启动日志。这时就有载入类的信息了。

    查看载入的类所在的包,与正确的包比較。

    补充:

    出现这样的情况。有可能是包的版本号引发的错误。所调用的方法在高版本号和低版本号的实现不一样。或者在某一版本号中,方法有缺失。

    也有可能是,两个不同的jar包。里面含有同样路径的类。然后在调用过程中混淆了。这种情况,能够在eclipse中使用shift+ctrl+T,查看project中有多少个这种类。查看类路径信息。


    3)找到引发异常的包(比方A)之后。再回到project里面。运行mvn dependency:tree > tree.log
    在tree.log里面查找A包的依赖信息。然后在顶层包的依赖中排除掉A包就可以。

    demo,假设在依赖树中也没找到依赖信息。

    非常可能是其它路径引入进来的(我不知道了。

    ),要解决的话,就要把A包全局排除掉,不要让它打进包中。


    a.网上搜了一下,有一个maven插件,依照配置了一下,未果。
    b.找到一个简单的方法。直接在父projectpom文件里增加此包的依赖。然后设置scope属性。


    即:

    <dependency>
      <groupId>A.groupID</groupId>
      <artifactId>A.artifactId</artifactId>

      <version>1.2.7</version>

    <scope>provided</scope>

    </dependency>

    c.在maven库中查找A包的其它版本号,看看有没有空包版本号,名字如not-exist等。

    然后再如projectpom中依赖此包。

    maven加入依赖的时候,会优先载入高版本号的jar包。假设依赖的这个包是空的。自然不会调里面的类或方法


    关于scope,能够參考这个:http://supercharles888.blog.51cto.com/609344/981316
    http://drizzlewalk.blog.51cto.com/2203401/665590
    compile 默认范围,一直实用。
    provided 编译时用,不会被打入jar包
    runtime 编译的时候不须要。执行和測试的时候须要。
    test 仅仅在測试编译和測试执行时须要
    system 须要制定一个本地路径,基于本地对象编译,不推荐使用。

    唉。菜鸟之路……

  • 相关阅读:
    c++ primer 中讲的顶层const 和 底层 const 理解
    github 0 学习
    MySQL 0 学习
    c++11 move构造函数和move operator 函数 学习
    c++11 多线程 1
    c++ 多线程 0
    学习 emplace_back() 和 push_back 的区别 emplace_back效率高
    crontab执行脚本失败问题
    lucene 排序
    maven 内置变量
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7280908.html
Copyright © 2011-2022 走看看