如何解决包冲突问题

一、问题定义
最近在用sbt打assembly包时出现问题,在package的时候,发生jar包冲突/文件冲突问题,两个相同的class来自不同的jar包在classpath内引起冲突。
具体是:我有一个self4j的jar, 还有一个hadoop-common-hdfs的jar包,其中hadoop-common-hdfs.jar内包含了self4j这个jar包,导致冲突。
此类异常一般是由于打包不规范和打包疏忽引起的。
(个人认为正确的打包策略是:只打包自己核心功能,不将依赖打包在一起,但是有时为了方便不得不打在一起,所以要注意可能会出现上述问题)
异常log如下:
[trace] Stack trace suppressed: run last *:assembly for the full output.
[error] (*:assembly) deduplicate: different file contents found in the following:
[error] C:\Users\shengli.victor\.ivy2\cache\org.slf4j\slf4j-api\jars\slf4j-api-1.7.7.jar:org/slf4j/IMarkerFactory.class
[error] C:\Users\shengli.victor\.ivy2\cache\com.xxx.xx.hdfsfile\hdfscommon\jars\hdfscommon-1.1.jar:org/slf4j/IMarkerFactory.class
[error] Total time: 4 s, completed
异常很明显,来自2个不同的jar包self4j, &hdfscommon-1.1.jar里,在org/slf4j/IMarkerFactory.class这个类冲突了。
hdfscommon-1.1/jar
slf4j-api-1.7.2.jar
二、解决方案
解决jar包冲突有两种方案:
1、删除其中的某个jar,或者说,在打包的时候,不将2个相同的class打在同一个jar包内的classpath内,即exclude jar。
2、合并冲突
1.&Excluding JARs and files
%&&provided&
将相同的jar中排除一个,因为重复,可以使用&provided&关键字。
例如spark是一个容器类,编写spark应用程序我们需要spark core jar. 但是真正打包提交到集群上执行,则不需要将它打入jar包内。
这是我们使用 % &provided& 关键字来exclude它。
libraryDependencies ++= Seq(
&org.apache.spark& %% &spark-core& % &0.8.0-incubating& % &provided&,
&org.apache.hadoop& % &hadoop-client& % &2.0.0-cdh4.4.0& % &provided&
Maven defines&&as:
This is much like&compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scopeprovided&because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.
2、Merge Strategy
如果在相对路径下,有多个相同的文件或者jar,这时我们可以使用Merge策略。
在build.sbt中对assemblyMergeStrategy&进行定义。
mergeStrategy in assembly &&= (mergeStrategy in assembly) { (old) =&
case PathList(&org&, &slf4j&, xs @ _*)
=& MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith &axiom.xml& =& MergeStrategy.filterDistinctLines
case PathList(ps @ _*) if ps.last endsWith &Log$Logger.class& =& MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith &ILoggerFactory.class& =& MergeStrategy.first
case x =& old(x)
解决方法:将org, slf4j 这个下的所有类和文件,都做合并, 采用的策略是:在classpath里,2选1,选的是classpath顺序里第一个self4j。
这里支持多种格式,例如ps.lat endsWith &axiom.xml& ,是以axiom.xml为结尾的文件,都采用filterDistinctLines策略,即合并两个文件,舍去重复的部分。
通过以上修改,终于解决了slf4j冲突的问题,即deduplicate: different file contents found in the following问题。
合并策略有很多种:
可以参考官方sbt assembly文档:
MergeStrategy.deduplicate&is the default described above
MergeStrategy.first&picks the first of the matching files in classpath order
MergeStrategy.last&picks the last one
MergeStrategy.singleOrError&bails out with an error message on conflict
MergeStrategy.concat&simply concatenates all matching files and includes the result
MergeStrategy.filterDistinctLines&also concatenates, but leaves out duplicates along the way
MergeStrategy.rename&renames the files originating from jar files
MergeStrategy.discard&simply discards matching files
更多的写法,example:
assemblyMergeStrategy in assembly := {
case PathList(&javax&, &servlet&, xs @ _*)
=& MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith &.html& =& MergeStrategy.first
case &application.conf&
=& MergeStrategy.concat
case &unwanted.txt&
=& MergeStrategy.discard
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
& 碰到类似的问题不要慌张,仔细看log描述的是什么意思。
& 异常报出内容冗余的冲突,在看路径,发现在classpath内有完全相同的2个类,这是导致问题的根本原因。
& 找出原因,解决方发,消除冲突两种方法,一直是去除法,另一种是合并法。
& 相对于maven和gradle,sbt的冲突解决方法还是比较接近底层。如果没记错的话,maven和gradle都能自动解决冲突。yum update软件包冲突处理问题?_Java123社区微信号:java123msg |||[][]当前位置: &
& yum update软件包冲突处理问题?问题如下: []# yum update 正在解决依赖关系 -- 正在检查事务 --- 软件包 alsa-firmware.noarch.0.1.0.27-2.el7 将被 升级 --- 软件包 alsa-firmware.noarch.0.1.0.28-2.el7 将被 更新 …… --- 软件包 thunderbird.x8问题如下:[]# yum update 正在解决依赖关系--& 正在检查事务---& 软件包 alsa-firmware.noarch.0.1.0.27-2.el7 将被 升级---& 软件包 alsa-firmware.noarch.0.1.0.28-2.el7 将被 更新……---& 软件包 thunderbird.x86_64.0.31.6.0-1.el7.centos 将被 更新---& 软件包 tuned.noarch.0.2.3.0-11.el7_0.3 将被 升级---& 软件包 tuned.noarch.0.2.4.1-1.el7 将被 更新--& 处理 avahi-autoipd-0.6.31-13.el7.x86_64 与 avahi & 0.6.31-13.el7 的冲突--& 处理 avahi-glib-0.6.31-13.el7.x86_64 与 avahi & 0.6.31-13.el7 的冲突--& 处理 avahi-gobject-0.6.31-13.el7.x86_64 与 avahi & 0.6.31-13.el7 的冲突--& 处理 avahi-libs-0.6.31-13.el7.x86_64 与 avahi & 0.6.31-13.el7 的冲突--& 处理 avahi-ui-gtk3-0.6.31-13.el7.x86_64 与 avahi & 0.6.31-13.el7 的冲突--& 解决依赖关系完成错误:软件包:avahi-libs-0.6.31-13.el7.x86_64 (@anaconda)& && && & 需要:avahi = 0.6.31-13.el7& && && & 正在删除: avahi-0.6.31-13.el7.x86_64 (@anaconda)& && && && &&&avahi = 0.6.31-13.el7& && && & 更新,由: avahi-0.6.31-14.el7.x86_64 (base)& && && && &&&avahi = 0.6.31-14.el7错误:avahi-libs conflicts with avahi-0.6.31-14.el7.x86_64错误:avahi-autoipd conflicts with avahi-0.6.31-14.el7.x86_64错误:avahi-glib conflicts with avahi-0.6.31-14.el7.x86_64错误:avahi-ui-gtk3 conflicts with avahi-0.6.31-14.el7.x86_64错误:avahi-gobject conflicts with avahi-0.6.31-14.el7.x86_64 您可以尝试添加 --skip-broken 选项来解决该问题** 发现 426 个已存在的 RPM 问题, 'yum check' 输出如下:1:NetworkManager-1.0.0-14.gitea599c.el7.x86_64 是 1:NetworkManager-0.9.9.1-29.gitdba720.el7_0.x86_64 的副本1:NetworkManager-glib-1.0.0-14.gitea599c.el7.x86_64 是 1:NetworkManager-glib-0.9.9.1-29.gitdba720.el7_0.x86_64 的副本1:NetworkManager-libnm-1.0.0-14.gitea599c.el7.x86_64 有已安装冲突 NetworkManager-glib & ('1', '1.0.0', '1'): 1:NetworkManager-glib-0.9.9.1-29.gitdba720.el7_0.x86_641:NetworkManager-tui-1.0.0-14.gitea599c.el7.x86_64 是 1:NetworkManager-tui-0.9.9.1-29.gitdba720.el7_0.x86_64 的副本abrt-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-ccpp-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-ccpp-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-kerneloops-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-kerneloops-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-pstoreoops-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-pstoreoops-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-python-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-python-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-vmcore-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-vmcore-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-addon-xorg-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-addon-xorg-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-cli-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-cli-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-console-notification-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-console-notification-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-dbus-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-dbus-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-desktop-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-desktop-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-gui-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-gui-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-gui-libs-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-gui-libs-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-libs-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-libs-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-python-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-python-2.1.11-12.el7.centos.0.1.x86_64 的副本abrt-tui-2.1.11-19.el7.centos.0.3.x86_64 是 abrt-tui-2.1.11-12.el7.centos.0.1.x86_64 的副本alsa-lib-1.0.28-2.el7.x86_64 是 alsa-lib-1.0.27.2-3.el7.x86_64 的副本anaconda-19.31.123-1.el7.centos.2.x86_64 是 anaconda-19.31.79-1.el7.centos.4.x86_64 的副本anaconda-widgets-19.31.123-1.el7.centos.2.x86_64 是 anaconda-widgets-19.31.79-1.el7.centos.4.x86_64 的副本audit-2.4.1-5.el7.x86_64 是 audit-2.3.3-4.el7.x86_64 的副本audit-libs-2.4.1-5.el7.x86_64 是 audit-libs-2.3.3-4.el7.x86_64 的副本audit-libs-python-2.4.1-5.el7.x86_64 是 audit-libs-python-2.3.3-4.el7.x86_64 的副本augeas-libs-1.1.0-17.el7.x86_64 是 augeas-libs-1.1.0-12.el7_0.1.x86_64 的副本authconfig-6.2.8-9.el7.x86_64 是 authconfig-6.2.8-8.el7.x86_64 的副本1:autocorr-en-4.2.6.3-5.el7.noarch 是 1:autocorr-en-4.1.4.2-3.el7.noarch 的副本共2页顶一下(0)0%踩一下(0)0%------分隔线------上一篇: 下一篇: 栏目列表推荐内容用Linux也有年头了,一直想考个RHCE,但都因为种种原因没考。听...
ubuntu的桌面版默认开启dnsmasq,所有的dns请求送127.0.0.1:53,由dn...
如题,aaa 用户如何 jstack bbb用户启动的 tomcat进程? 想请教一下...
首先ssh工具莫名无法连接服务器,一连接就被强制退出。 然后到...
远程(win Server 2008)文件服务器共享的目录,到linux服务器红帽...
涉及文件: vsftpd.conf chroot_list_file=/etc/vsftpd.chroot_list 如果设置为...}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信