• 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 须要制定一个本地路径,基于本地对象编译,不推荐使用。

    唉。菜鸟之路……

  • 相关阅读:
    电容降压的工作原理与计算
    B站开源ijkplayer 等多个项目
    Kindle支持哪些格式
    PPM格式解析
    YUV RGB播放器 打开, 显示RGB数据
    How to print 如何输出 int64_t,uint64_t的值 in C
    FileSeek文件内容搜索工具下载
    对android录制的NV21视频数据进行旋转(90,180,270)与剪切
    Adobe Flash Media Server安装
    Linux使用du和df查看磁盘和文件夹占用空间
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7280908.html
Copyright © 2020-2023  润新知