如何maven 解决包冲突突问题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(319)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'解决服务器jar包冲突的4种方法',
blogAbstract:'现象在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常: 1, java类找不到 java.lang.ClassNotFoundException2, 方法不存在 java.lang.NoSuchMethodError3, 字段不存在 java.lang.NoSuchFieldError4, 类错误 java.lang.LinkageError原因war包中jar包和服务器上jar包冲突, 由于现在服务器功能越来越强大, 而引入的jar也在不断增加, 出现的冲突的可能性也越来越大, 而且正式环境复杂, 而且不能轻易修改服务器相关配置, 为解决jar包冲突的问题带来困难, 如果去解决过这些问题, 那是相当折腾人的, 下面是一些方法的总结根本 这类冲突根本原因就是: 同一个java类存在多个jar包或类路径中, 而这大多由于使用了不同jar包版本造成.',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}遇到一个问题不如何解决:关于包依赖和冲突。 - 查看主题 & Ubuntu中文论坛
&[ 7 篇帖子 ]&
&文章标题 : 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
10:57帖子: 1003地址: 金山
系统: ubuntu14.04
代码:$ dpkg& -l | grep 'libstdc++6'rU& libstdc++6:amd64& & & & & & & & & & & & & & & & & & & & & & 4.9.1-12& & & & & & & & & & & & & & & & & & & & & & amd64& & & & GNU Standard C++ Library v3rF& libstdc++6:i386& & & & & & & & & & & & & & & & & & & & & & &4.8.2-19ubuntu1& & & & & & & & & & & & & & & & & & &i386& & & & &GNU Standard C++ Library v3之前的状态是iU和iF,由于用dpkg卸载了一次成为了rU和rFlibstdc++6:i386 是以前装的,没有问题的。libstdc++6:amd64 是昨晚通过昨晚下载下来的libstdc++6_4.9.1-12_amd64.deb文件通过dpkg安装的,安装时由于遇到依赖关系没有成功。现在由于libstdc++6:amd64安装时未满足依赖关系以及和libstdc++6:i386的冲突,导致apt 和软件中心都不能用了,比如:代码:$ sudo apt-get& remove firefoxReading package lists... DoneBuilding dependency tree& & & &Reading state information... DoneYou might want to run 'apt-get -f install' to correct these:The following packages have unmet dependencies:libstdc++6 : Depends: gcc-4.9-base (= 4.9.1-12) but 4.9-ubuntu1 is to be installed& & & & & & & Breaks: libstdc++6:i386 (!= 4.9.1-12) but 4.8.2-19ubuntu1 is to be installed&libstdc++6:i386 : Breaks: libstdc++6 (!= 4.8.2-19ubuntu1) but 4.9.1-12 is to be installed&xul-ext-unity : Depends: firefox (&= 10.0) but it is not going to be installed&xul-ext-webaccounts : Depends: firefox (&= 9.0) but it is not going to be installedE: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).如果卸载代码:$ sudo apt-get& remove libstdc++6:amd64Reading package lists... DoneBuilding dependency tree& & & &Reading state information... DoneYou might want to run 'apt-get -f install' to correct these:The following packages have unmet dependencies:appmenu-qt : Depends: libstdc++6 (&= 4.1.1) but it is not going to be installedappmenu-qt5 : Depends: libstdc++6 (&= 4.1.1) but it is not going to be installed..... 不知如何是好?libstdc++6:i386 和 libstdc++6冲突了如果卸载 libstdc++6:amd64
apt觉得是在卸载libstdc++6:i386, 而libstdc++6:i386是被许多包依赖着的。
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
16:10帖子: 1845
系统: Arch debian win7
代码:sudo apt-get -f install这个执行下看看呢
_________________拥有丰富API接口和广泛程序支持的dropbox云同步,,开始就比别人多500兆,我的空间也会增加。谢啦==========我的作品==========
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
10:57帖子: 1003地址: 金山
系统: ubuntu14.04
zhw2101024 写道:代码:sudo apt-get -f install这个执行下看看呢不行啊代码:$ sudo apt-get install -fReading package lists... DoneBuilding dependency tree& & & &Reading state information... DoneCorrecting dependencies... failed.The following packages have unmet dependencies:&libstdc++6 : Depends: gcc-4.9-base (= 4.9.1-12) but 4.9-ubuntu1 is installed& & & & & & & Breaks: libstdc++6:i386 (!= 4.9.1-12) but 4.8.2-19ubuntu1 is installed&libstdc++6:i386 : Breaks: libstdc++6 (!= 4.8.2-19ubuntu1) but 4.9.1-12 is installedE: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.E: Unable to correct dependencies
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
3:29帖子: 1544
这种问题一般都是你自己搞得源列表中有错误或冲突了,别随便使用sudo apt-get -f install,要首先明确问题出在哪里。。。代码:cat /etc/apt/sources.list
_________________16.04--&14.04
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
10:57帖子: 1003地址: 金山
系统: ubuntu14.04
引用:这种问题一般都是你自己搞得源列表中有错误或冲突了,别随便使用sudo apt-get -f install,要首先明确问题出在哪里sources.list文件没做过修改系统原来有libstdc++6(4.8.2-19ubuntu1)昨晚下载安装了libstdc++6_4.9.1-12_amd64.deb现在冲突了卸又卸不掉
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
3:29帖子: 1544
ok,明白了。可以尝试用aptitude而不是apt通过忽略包依赖关系的方法卸载掉你自己安装的包。代码:sudo apt-get install aptitude自己看一下aptitude的man page,里面有好几种方式解决包依赖的问题,推荐首先尝试--safe-resolver。如不行可以尝试类似这样的命令:代码:sudo aptitude -fy remove your-problem-package注意命令提示,不要误删了一大堆必需的包!!!
_________________16.04--&14.04
&文章标题 : Re: 遇到一个问题不如何解决:关于包依赖和冲突。发表于 :
10:57帖子: 1003地址: 金山
系统: ubuntu14.04
引用:ok,明白了。可以尝试用aptitude而不是apt通过忽略包依赖关系的方法卸载掉你自己安装的包。谢谢回复不过刚才apt和软件中心都废掉了:即不能用sudo apt-get install 安装任何软件现在问题解决了方法如下:单独下载一个libstdc++6(4.8.2-19ubuntu1)amd64位的.deb文件,然后安装之代码:$ sudo dpkg -i libstdc++6_4.8.2-19ubuntu1_amd64.deb昨晚安装的libstdc++6_4.9.1-12_amd64.deb就被覆盖了代码:$ dpkg& -l | grep 'libstdc++6'ii& libstdc++6:amd64& & & & & & & & & & & & & & & & & & & & & & 4.8.2-19ubuntu1& & & & & & & & & & & & & & & & & & &amd64& & & & GNU Standard C++ Library v3ii& libstdc++6:i386& & & & & & & & & & & & & & & & & & & & & & & & 4.8.2-19ubuntu1& & & & & & & & & & & & & & & & & & &i386& & & & &GNU Standard C++ Library v3两个版本一致了,就没有冲突了。这里刚开始libstdc++6:i386的状态是ri。我用sudo apt-get --reinstall install libstdc++6:i386重装了一下,就ii了
显示帖子 : 全部帖子1天7天2周1个月3个月6个月1年&排序 作者发表时间文章标题 升序降序&
&[ 7 篇帖子 ]&
正在浏览此版面的用户:没有注册用户 和 3 位游客
您 不能 在这个版面发表主题您 不能 在这个版面回复主题您 不能 在这个版面编辑帖子您 不能 在这个版面删除帖子您 不能 在这个版面提交附件
选择一个版面
------------------
公告/注意事项
& &新闻和通知
& &校园社团支持
& && &华东校区
& && &华南校区
& && &华北校区
& && &华中校区
& && &东北校区
& && &西北校区
& && &港澳台校区
& && &国外校区
& &软件推荐
& &非常任务
系统安装区
& &教学和常见问答
& && &课堂教学和培训
& &初学者园地 - 16.10 - Yakkety Yak
& &系统安装和升级
& && &新立得和软件源
& && &Wubi安装讨论
& &启动和引导
& &网卡问题以及网络和拨号
& && &校园网拨号
& &笔记本、UMPC支持
& &手机和平板
& && &Ubuntu移动应用开发
& &常用硬件支持
& &系统架构支持
配置美化区
& &字体美化和中文支持
& && &个人配置文件存放点
& &桌面特效
& &窗口管理器
& &屏幕抓图
& &办公、图像、机械电子设计等
& && &Vim和Emacs
& &因特网相关软件
& &影音多媒体
& &Wine及其分支
& &游戏和游戏模拟器
& &虚拟机和虚拟化
& &其它类软件
& &开源模板库
服务器管理
& &服务器基础应用
& &数据库管理
& &服务器维护和硬件相关
& &Ubuntu VPS
参与Ubuntu开发
& &软件和文档翻译
& &编译或打包
& &Ubuntu错误报告
程序设计区
& &Shell脚本
& &GTK+和QT
& &软件/网站开发
& && &Python/Php/Perl
& && &C/C++/Java
& &内核及嵌入式开发
& &开源小工具
& &Ubuntu 17.04
& &Ubuntu 16.04 LTS
& &Ubuntu 14.04 LTS
& &Ubuntu 12.04 LTS
& &Ubuntu 10.04 LTS
& &老旧版本支持
& && &Ubuntu 15.10
& && &Ubuntu 15.04
& && &Ubuntu 14.10
衍生发行版
& &Ubuntu GNOME
& &Kubuntu
& &Xubuntu & Lubuntu
& &Ubuntu中文衍生版
& && &UbuntuKylin
& &Ubuntu国外衍生版
& && &Mint
& &Ubuntu衍生版制作
& &其它类Unix OS发行版
& && &Arch发行版
& && &Debian发行版
& && &OpenSUSE发行版
& && &Deepin
& &深度PK版
& &Ubuntu故事和感慨
& &Full Circle开源杂志
分享交流区
& &同城交流
& &线下活动专版
& &Ubuntu宣传推广
& &论坛管理
& && && &Ubuntu中文网上商店后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 6159|回复: 8
如何解决包冲突问题?离线导航。
在线导航SDK可以在开放平台统一下载链接,可以解决包冲突的问题,我的导航SDK是离线版本,需要进行相关包替换。我的版本是地图版本是libBaiduMapSDK_v3_2_0_15,定位版本是liblocSDK5,导航版本是BaiduNaviSDK_v1_0_0。如何替换?
选择要使用的sdk功能,下载统一好的jar包,添加到工程中。离线SDK提供的jar包,去掉galaxy_mini_lbs.jar和lbs_auth.jar。看能否解决问题
这离线导航sdk没开放啊,申请也没反应
解决问题了,谢谢你!现在还有一个问题,至从用来离线导航SDK后,key的认证经常失败,有时成功有时失败,不知道是什么原因,打印失败原因,是乱码(如下代码的arg1为乱码)。
是不是有什么限制?能否说明一下?
private BNKeyVerifyListener mKeyVerifyListener = new BNKeyVerifyListener() {
public void onVerifySucc() {
// TODO Auto-generated method stub
public void onVerifyFailed(int arg0, String arg1) {
// TODO Auto-generated method stub
您好,由于离线导航SDK的鉴权模块正在升级,所以key验证不稳定。
怎么下载离线导航SDK?
xiaogang__123
您好,离线导航需要提交申请,百度根据您的产品形态决定是否给予支持
我也在找离线导航SDK啊
回复 6# xiaogang__123
您好,离线导航需要提交申请,百度根据您的产品形态决定是否给予支持 ...
你好,有申请链接吗?
Powered byYARN环境中应用程序JAR包冲突问题的分析及解决
时间: 20:21:37
&&&& 阅读:775
&&&& 评论:
&&&& 收藏:0
标签:Hadoop框架自身集成了很多第三方的JAR包库。Hadoop框架自身启动或者在运行用户的MapReduce等应用程序时,会优先查找Hadoop预置的JAR包。这样的话,当用户的应用程序使用的第三方库已经存在于Hadoop框架的预置目录,但是两者的版本不同时,Hadoop会优先为应用程序加载Hadoop自身预置的JAR包,这种情况的结果是往往会导致应用程序无法正常运行。下面从我们在实践中遇到的一个实际问题出发,剖析Hadoop on YARN 环境下,MapReduce程序运行时JAR包查找的相关原理,并给出解决JAR包冲突的思路和方法。一、一个JAR包冲突的实例我的一个MR程序需要使用jackson库1.9.13版本的新接口:图1:MR的pom.xml,依赖jackson的1.9.13但是我的Hadoop集群(CDH版本的hadoop-2.3.0-cdh5.1.0)预置的jackson版本是1.8.8的,位于Hadoop安装目录下的share/hadoop/mapreduce2/lib/下。使用如下命令运行我的MR程序时:hadoop jar mypackage-0.0.1-jar-with-dependencies.jar com.umeng.dp.MainClass --input=../input.pb.lzo --output=/tmp/cuiyang/output/由于MR程序中使用的JsonNode.asText()方法,是1.9.13版本新加入的,在1.8.8版本中没有,所以报错如下:…15/11/13 18:14:33 INFO mapreduce.Job: &map 0% reduce 0%15/11/13 18:14:40 INFO mapreduce.Job: Task Id : attempt_9_0022_m_, Status : FAILEDError: org.codehaus.jackson.JsonNode.asText()Ljava/lang/S…二、搞清YARN框架执行应用程序的过程在继续分析如何解决JAR包冲突问题前,我们需要先搞明白一个很重要的问题,就是用户的MR程序是如何在NodeManager上运行起来的?这是我们找出JAR包冲突问题的解决方法的关键。本篇文章不是一篇介绍YARN框架的文章,一些基本的YARN的知识假定大家都已经知道,如ResourceManager(下面简称RM),NodeManager(下面简称NM),AppMaster(下面简称AM),Client,Container这5个最核心组件的功能及职责,以及它们之间的相互关系等等。 图2:YARN架构图如果你对YARN的原理不是很了解也没有关系,不会影响下面文章的理解。我对后面的文章会用到的几个关键点知识做一个扼要的总结,明白这些关键点就可以了:从逻辑角度来说,Container可以简单地理解为是一个运行Map Task或者Reduce Task的进程(当然了,AM其实也是一个Container,是由RM命令NM运行的),YARN为了抽象化不同的框架应用,设计了Container这个通用的概念;Container是由AM向NM发送命令进行启动的;Container其实是一个由Shell脚本启动的进程,脚本里面会执行Java程序,来运行Map Task或者Reduce Task。好了,让我们开始讲解MR程序在NM上运行的过程。上面说到,Map Task或者Reduce Task是由AM发送到指定NM上,并命令NM运行的。NM收到AM的命令后,会为每个Container建立一个本地目录,将程序文件及资源文件下载到NM的这个目录中,然后准备运行Task,其实就是准备启动一个Container。NM会为这个Container动态生成一个名字为launch_container.sh的脚本文件,然后执行这个脚本文件。这个文件就是让我们看清Container到底是如何运行的关键所在!脚本内容中和本次问题相关的两行如下:export CLASSPATH="$HADOOP_CONF_DIR:$HADOOP_COMMON_HOME/share/hadoop/common/*:(...省略…):$PWD/*"exec /bin/bash -c "$JAVA_HOME/bin/java -D(各种Java参数) org.apache.hadoop.mapred.YarnChild 127.0.0.1 58888 (其他应用参数)"先看第2行。原来,在YARN运行MapReduce时,每个Container就是一个普通的Java程序,Main程序入口类是:org.apache.hadoop.mapred.YarnChild。我们知道,JVM加载类的时候,会依据CLASSPATH中路径的声明顺序,依次寻找指定的类路径,直到找到第一个目标类即会返回,而不会再继续查找下去。也就是说,如果两个JAR包都有相同的类,那么谁声明在CLASSPATH前面,就会加载谁。这就是我们解决JAR包冲突的关键!再看第1行,正好是定义JVM运行时需要的CLASSPATH变量。可以看到,YARN将Hadoop预置JAR包的目录都写在了CLASSPATH的最前面。这样,只要是Hadoop预置的JAR包中包含的类,就都会优先于应用的JAR包中具有相同类路径的类进行加载!那对于应用中独有的类(即Hadoop没有预置的类),JVM是如何加载到的呢?看CLASSPATH变量定义的结尾部分:"/*:$PWD/*"。也就是说,如果Java类在其他地方都找不到的话,最后会在当前目录查找。那当前目录究竟是什么目录呢?上面提到过,NM在运行Container前,会为Container建立一个单独的目录,然后会将所需要的资源放入这个目录,然后运行程序。这个目录就是存放Container所有相关资源、程序文件的目录,也就是launch_container.sh脚本运行时的当前目录。如果你执行程序的时候,传入了-libjars参数,那么指定的JAR文件,也会被拷贝到这个目录下。这样,JVM就可以通过CLASSPATH变量,查找当前目录下的所有JAR包,于是就可以加载用户自引用的JAR包了。在我的电脑中运行一次应用时,该目录位于/Users/umeng/worktools/hadoop-2.3.0-cdh5.1.0/ops/tmp/hadoop-umeng/nm-local-dir/usercache/umeng/appcache/application_9_0023,内容如下(可以通过配置文件进行配置,从略):图3:NM中Job运行时的目录好了,我们现在已经知道了为何YARN总是加载Hadoop预置的class及JAR包,那我们如何解决这个问题呢?方法就是:看源码!找到动态生成launch_container.sh的地方,看是否可以调整CLASSPATH变量的生成顺序,将Job运行时的当前目录,调整到CLASSPATH的最前面。三、阅读源码, 解决问题追溯源码,让我们深入其中,透彻一切。首先想到,虽然launch_container.sh脚本文件是由NM生成的,但是NM只是运行Task的载体,而真正精确控制Container如何运行的,应该是程序的大脑:AppMaster。查看源码,果然验证了我们的想法:Container的CLASSPATH,是由MRApps(MapReduce的AM)传给NodeManager的,NodeManager再写到sh脚本中。MRApps中的TaskAttemptImpl::createCommonContainerLaunchContext()方法会创建一个Container,之后这个Container会被序列化后直接传递给NM;这个方法的实现中,调用关系为:createContainerLaunchContext() -& getInitialClasspath() -& MRApps.setClasspath(env, conf)。首先,我们来看setClasspath():首先,会判断userClassesTakesPrecedence,如果设置了这个Flag,那么就不会去调用MRApps.setMRFrameworkClasspath(environment, conf)这个方法。也就是说,如果设置了这个Flag的话,需要用户设置所有的JAR包的CLASSPATH。下面看setMRFrameworkClasspath()方法:其中,DEFAULT_YARN_APPLICATION_CLASSPATH里放入了所有Hadoop预置JAR包的目录。能够看到,框架会先用YarnConfiguration.YARN_APPLICATION_CLASSPATH设置的CLASSPATH,如果没有设置,则会使用DEFAULT_YARN_APPLICATION_CLASSPATH。然后由conf.getStrings()把配置字符串按逗号分隔转化为一个字符串数组;Hadoop遍历该数组,依次调用MRApps.addToEnvironment(environment, Environment.CLASSPATH.name(), c.trim(), conf)设置CLASSPATH。看到这里,我们看到了一线曙光:默认情况下,MRApps会使用DEFAULT_YARN_APPLICATION_CLASSPATH作为Task的默认CLASSPATH。如果我们想改变CLASSPATH,那么看来我们就需要修改YARN_APPLICATION_CLASSPATH,让这个变量不为空。于是,我们在应用程序中加入了如下语句:String[]&classpathArray&=&config.getStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH,&YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH);String&cp&=&"$PWD/*:"&+&&StringUtils.join(":",&classpathArray);config.set(YarnConfiguration.YARN_APPLICATION_CLASSPATH,&cp);上面的语句意思是:先获得YARN默认的设置DEFAULT_YARN_APPLICATION_CLASSPATH,然后在开头加上Task程序运行的当前目录,然后一起设置给YARN_APPLICATION_CLASSPATH变量。这样,MRApps在创建Container时,就会将我们修改过的、程序当前目录优先的CLASSPATH,作为Container运行时的CLASSPATH。最后一步,我们需要将我们的应用依赖的JAR包,放入到Task运行的目录中,这样加载类的时候,才能加载到我们真正需要的类。那如何做到呢?对,就是使用-libjars这个参数,这个前面也已经解释过了。这样,运行程序的命令就改为如下:hadoop jar ./target/mypackage-0.0.1-SNAPSHOT-jar-with-dependencies.jar com.umeng.dp.MainClass -libjars jackson-mapper-asl-1.9.13.jar,jackson-core-asl-1.9.13.jar --input=../input.pb.lzo --output=/tmp/cuiyang/output/四、结语本文中,我们通过分析Hadoop的源代码,解决了我们遇到的一个JAR包冲突问题。即使再成熟再完善的文档手册,也不可能涵盖其产品所有的细节以解答用户所有的问题,更何况是Hadoop这种非以盈利为目的的开源框架。而开源的好处就是,在你困惑的时候,你可以求助源码,自己找到问题的答案。这正如侯捷老师所说的: “源码面前,了无秘密”。本文出自 “” 博客,请务必保留此出处标签:
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 maven解决jar包冲突 的文章

 

随机推荐