如何解决包怎么找包的冲突问题题

解决包冲突的说明_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
解决包冲突的说明
你可能喜欢AS中jar包冲突解决方案 - 陈园的博客 - CSDN博客
AS中jar包冲突解决方案
android杂乱
既然出现了Error:Execution failed for task ‘:app:transformClassesWithDesForDebug’这种jar包冲突的问题,那就讲讲解决方案吧
- 使用exclude
过滤可以很好的解决Android项目中jar包冲突的问题,比如说你的项目中引用了v7,同时又引入了v4,在Android 中v7包默认是包含v4包的,那么就可以使用exclude解决冲突,只需要添加如下代码:
compile ('com.android.support:appcompat-v7:25.2.0'){exclude module: 'support-v4'}
在你创建项目的时候,当你稍微留心一点,你就会发现在项目创建的时候就已经有这样的用法了,比如:
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
使用provided
假如,在你引入的module和主module中都有v4包,那么你就可以使用provided
这里讲一下compile和provided的区别
compile是指项目编译和运行时都需要依赖
provided是指在项目编译时需要,运行时不需要
可以在你引入的项目module的build.gradle中添加
dependencies {
provided fileTree(dir: 'libs', include: ['*.jar'])
我的热门文章博客分类:
背景
最近工作上需要实现从mysql到hbase的实时数据同步的功能。经过多方了解,整理出解决方案:使用canal作为实时的数据源,然后开发一个client来完成与canal的对接,并将数据写入hbase数据库中。
问题
在开发接近尾声时,发现连接canal时需要使用protobuf-java-2.4.1.jar包,而连接hbase时则需要使用protobuf-java-2.5.0.jar。并且两者jar包无法兼容,使用任何一个jar都无法正常启动程序。
解决思路
为了程序能够正常运行,需要同时加载两个jar包。但是我们都知道,一个class在jvm内存中只有一份。
1.首先想到的是将canal中的protobuf版本升级至2.5.0,即修改canal源码使之使用2.5.0的jar包;
2.其次想到的合并2.4.1和2.5.0得到一个新的包,即比较2.4.1和2.5.0的不同之处,然后合并;
3.修改2.4.1中class的名字(通过修改package名)并重新打jar包,然后修改canal中引用到protobuf的地方并重新打jar包
事实证明第三种方法可行性最高,简单、方面又实用。
翻滚吧--少年
浏览: 10643 次
来自: 杭州
1、累2、坑
mysqldump --opt database | mysq ...
这个代码你最好格式化一下
int j = 1;
boolea ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'一次jar包冲突的解决过程 - 关攀攀 - 博客园
随笔 - 53, 文章 - 1, 评论 - 1, 引用 - 0
背景介绍,项目通过maven来管理,有项目依赖关系,使用eclipse的springSource tool suite来编译
项目在执行junit测试时报如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.&init&(Ljava/lang/C)V at org.springframework.monAnnotationBeanPostProcessor.findResourceMetadata(CommonAnnotationBeanPostProcessor.java:318) at org.springframework.monAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:277) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:798) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:493) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:880) at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:596) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:365) at org.springframework.context.support.ClassPathXmlApplicationContext.&init&(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.&init&(ClassPathXmlApplicationContext.java:83) at TestSpring.main(TestSpring.java:12)
分析:找不到InjectionMetadata的构造函数(Ljava/lang/C)
& & & 查看InjectionMetadata方法声明,项目中maven使用spring3.0
spring2.5构造函数:(&targetClass)&
spring3.0构造函数:(&?&&targetClass,&&&&elements)&
错误原因很清楚:spring-context.jar的版本使用的2,调用InjectionMetadata的构造函数(Ljava/lang/C),问题是spring-context.jar的2版本eclipse从哪找的
查看了pom.xml依赖关系图,未找到引用spring2版本
查找项目依赖的mavenlib包也没有spring2相关jar
为了防止是Junit造成,改用main函数调用,错误依然
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); }
用类的加载顺序先于jar包,强制版本
直接在项目的源代码中加入spring的CommonAnnotationBeanPostProcessor类源代码,根据类的加载顺序会加载本类,确实不报找不到方法了。
小插曲:CommonAnnotationBeanPostProcessor中有引用&import javax.ejb.EJB;怀疑是不是因为没有javax.ejb.EJB相关jar包引起的,如果是因为没有javax.ejb.EJB相关jar,那tomcat下为什么能正常引用,除非tomcat下有相关jar包,后来从tomcat下找到apache-tomcat-6.0.26\lib\annotations-api.jar,把annotations-api.jar引用eclipse编译路径下,CommonAnnotationBeanPostProcessor不报错了,但删除CommonAnnotationBeanPostProcessor类,错误依然。说明还是存在jar包冲突。
还说明一个java语言的一个规定:如果加载的Class文件中引用了不存在的其它类,是可以正常加载的,除非调用了相关方法才会报错。这只是个小插曲,和错误原因无关。
删除所有依赖,全部手工加载外部jar
改动后,jar包从maven编译完后的target下取得
没有错误了,通过试错,最终发现是因为&Web App Libraries造成的问题
&附上&Web App Libraries的具体内容:
最终原因分析:eclipse的&Web App Libraries和maven的编译机制存在差异
在maven体系中:通过在maven中认为无依赖的可能会通过Web App Libraries最终达到eclipse的编译路径中。
只要对应的项目处理打开有状态中,如果关闭dao项目,就不会报错。只要打开依赖的项目,maven中的exclusions对于eclipse是失效的。Maven怎么处理引用的jar版本冲突? - maven - ITeye群组
& 上一页 1
我找到的个项目 AAA的,但是用的是lucene3.0. 而我们现在的工程BBB里面已经用了lucene2.9-----我们的项目用这个AAA怎么处理lucene冲突啊?
&dependency&& &artifactId&aaa&/& &exclusions&&&& &exclusion&&&&&& &artifactId&lucene&/...
同一个artifactId,maven只会加载版本高的jar。不研究过,不十分确定这样的机制。
有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
那这就是硬伤了
peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
cosmo1987 写道peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
现在想想看,有一个方法相对可行。把应用这两个版本不同方法的部分,拆成两个子项目,两个子项目各自引用不同版本的包。这样就能够同时引用,也不会冲突。
peizhyi 写道cosmo1987 写道peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
现在想想看,有一个方法相对可行。把应用这两个版本不同方法的部分,拆成两个子项目,两个子项目各自引用不同版本的包。这样就能够同时引用,也不会冲突。
拆成两个子项目,如果是指maven项目下的两个module的话,最后构建maven的web项目时两个module所依赖的jar会打包到一个war中。问题没有解决。而如果是指两个maven项目并且分别部署的话,这样仅仅为了隔离jar依赖而拆项目,这个项目也不好拆。毕竟拆项目的依据还是在当一个应用过大,需要降低耦合划分成两个子系统的时候才需要做。之前又想到两个解决方案。不过还有待权衡。1.引入OSGI架构。架构的引入可以很好的以组件的形式可插拔的更换模块,并且可以很好的做到jar隔离。但是OGSI的引入又会带来很多其他的麻烦。学习成本增加,OSGI的引入必然带来整个项目结构的变动,而且引入OSGI后,所有的模块都必须以OSGI的方式进行,对于一些觉得很简单且没有必要使用OSGI方式编写的代码,不能被OSGI引用。2.自己实现web container下一级的application classloader。对于一些特殊的jar使用配置的方式让自己实现的classloader进行加载。在classloader这一层做到隔离后的jar相互调用问题。这个classloader的实现确实是一个技术活。需要解决很多问题。开发成本提高很多。目前为止还是没有想出简单方便的方法解决这个问题。
& 上一页 1
相关资源推荐}

我要回帖

更多关于 svn如何解决冲突问题 的文章

更多推荐

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

点击添加站长微信