精华内容
下载资源
问答
  • android引入第三方aar,jar冲突如何解决?
    千次阅读
    2020-07-06 15:21:20

    引入第三方aar,发现第三方aar里面的jar和本地项目的jar冲突了 如何解决?

    方法一:proguard-rules.pro里面加上

    -repackageclasses 'youappname or packageName'

    加上这一句后,aar里面的class都会归为这个名称下,一般加上这一句,就不会和其他应用冲突,除非调用方的repackageclasses和你重名,而且又引用了相同的第三方jar

    方法二:把本地引入的冲突的jar删了 (缺点:是否会影响自身的APP?需要测试)

    方法三:删除aar里面的冲突的jar相关的class,重新打成aar (缺点:是否会影响应用的AAR?需要测试)

    用winRAR打开aar文件,再把里面的classes.jar拖出来,再使用winRAR打开classes.jar删除里面冲突的jar,比如okhttp相关的,再次打开aar,把改过的jar拖进去即可。

    以上步骤也可使用命令行来完成:

    在linux环境,先解压

    unzip test-v1.0.2.aar -d  /usr/local/test/test-v1.0.2

    再使用winrar打开classes.jar,删除冲突的jar

    重新打成aar包,记得后面还有个 .

    jar cvf test-v1.0.3.aar -C test-v1.0.2/ .

    方法四:aar提供方jar依赖改成在build.gradle添加依赖

    比如原先在lib文件夹下添加了谷歌的zxing,二维码处理相关jar

    core_3.3.0.jar

    现在改成

    dependencies {
    api 'com.google.zxing:core:3.3.0'

    }

    因为APP本身是通过这种方式,aar提供方也通过这种方式来添加依赖,通过build.gradle里面添加依赖的方式,可以发现打出的aar里面不会包含依赖的包的,那么就不会造成冲突,我理解,gradle编译时,可能发现有两个相同的依赖,只会加载一个,这样就不会造成冲突了。

    方法五:添加依赖的时候api,compile,implementation换成provided或compileOnly

     provided(compileOnly)

    只在编译时有效,不会参与打包,可以在自己的moudle中使用该方式依赖。比如com.android.support,gson这些使用者常用的库,避免冲突。

    compileOnly files('mylibs/sdk.jar')

    provided files('mylibs/sdk.jar')

    另外关于android gradle仓库,国外经常连不上其实可以加上aliyun提供的

    buildscript {
        repositories {
            google()
            jcenter()
            maven { url 'https://maven.aliyun.com/repository/jcenter' }
            maven { url 'https://maven.aliyun.com/repository/google'}
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.2.1'
            
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
            maven { url 'https://maven.aliyun.com/repository/jcenter' }
            maven { url 'https://maven.aliyun.com/repository/google'}
        }
    }

    更多相关内容
  • 在tomcat下部署成功,迁移到weblogic下,报错,一般都是配置和jar包问题,配置问题开发根据报错能解决,jar冲突比较烦人,这里给出了解决方案。
  • Android文件夹中是直接把commons-beanutils-1.7.0.jar中的org/apache/commons/collections目录和目录下的class删掉的
  • 主要介绍了Jar冲突问题原理及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了完美解决android 项目jar冲突的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 检测工具 jar冲突

    2018-05-09 09:24:48
    检测工具 jar冲突
  • 主要介绍了Maven中jar冲突原理与解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 查找 jar冲突的工具 还可以

    热门讨论 2014-11-21 11:09:39
    从指定路径包含的一系列jar包里面,查找指定java Class被包含的具体位置。
  • 检查jar冲突

    2017-12-28 09:14:51
    检查jar冲突检查jar冲突检查jar冲突检查jar冲突
  • classloader解决jar冲突隔离

    千次阅读 2018-11-07 19:41:31
    业务背景 随着业务的发展 和 架构的升级, 业务会越来越多的依赖公司内部提供的 中间件 ,如 rpc服务框架、分库分表框架、异步消息框架、公共...这些jar包依赖不仅会产生版本冲突,甚至会有jar包不兼容的情况出现,...

    业务背景

    随着业务的发展 和 架构的升级, 业务会越来越多的依赖公司内部提供的 中间件 ,如 rpc服务框架、分库分表框架、异步消息框架、公共工具包等等。

    每个中间件都有自己的 jar包依赖体系,最常用的如: logback、log4j、httpclient 、common-lang 、guava、zookeeper 等等 ,

    这些jar包依赖不仅会产生版本冲突,甚至会有jar包不兼容的情况出现,比如 log4j 和 logback , guava 和 common-collection ,等等。

    随着时间推移,业务越来越复杂,依赖的中间件也越来越多,每当引入新的中间件时,jar包版本管理的风险也越来越大,甚至出现无法兼容的情况。

    解决方案

    中间件容器与 业务web容器隔离,jar包依赖互不影响。 不仅解决了令人头痛的jar包冲突、jar包不兼容问题,还释放了业务开发人员的压力和责任,

    公司内部的中间件通过专门的运维人员来推动升级,将业务与中间件隔离,通过透明的方式提供服务。

    实现原理

    回顾一下jvm的classloader加载机制

    当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:

    bootstrap classloader | extension classloader | app classloader
    自上往下加载
    自下往上查找

    bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类。 在执行java的命令中使用-Xbootclasspath选项或使用 - D选项指定sun.boot.class.path系统属性值可以指定附加的类。 这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。 可以通过下面的代码来查看原始类加载器加载了那些jar包, 它主要负责加载 JAVA_HOME/lib/*.jar

    extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。 默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。 临时解决jar冲突的终极大招:将jar包拷贝到ext目录下。

    在这个实例上调用方法getParent()总是返回空值null,因为引导加载器bootstrap classloader不是一个真正的ClassLoader实例。
    app classloader -系统类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性 或者 CLASSPATH*作系统属性所指定的JAR类包和类路径。 总能通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。

    classloader 加载类用的是全盘负责、委托机制

    所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;

    如何实现jar包的容器隔离

    业务应用 依赖—–> middleware-client.jar
    中间件具体实现 依赖—–> middleware-client.jar
    通过client包 解耦合,实现最少依赖。

    代码示例

    中间件服务接口IMiddlewareService

    public interface IMiddlewareService {
    
        String reverse(String str);
    
    }
    

    SimpleClassLoader

    public class SimpleClassLoader extends URLClassLoader{
    
    	// 中间件jar路径
        private static final String JAR_BASE_PATH="e:/middleware/";
    
        public SimpleClassLoader(URL[] urls) {
            //parent 设置为null 则不会被 system classloader 加载
            super(urls,null);
            try {
                File file=new File(JAR_BASE_PATH);
                String[]arr=file.list();
                for(String jar : arr) {
                    super.addURL(new URL("file:"+JAR_BASE_PATH+jar));
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
    //        if("com.qiyi.middleware.service.IMiddlewareService".equals(name)){
    //            return SimpleClassLoader.class.getClassLoader().loadClass(name);
    //        }
            try {
                return super.findClass(name);
            }catch (ClassNotFoundException e){
                return SimpleClassLoader.class.getClassLoader().loadClass(name);
            }
        }
    }
    

    工厂类MiddlewareServiceFactory

    public class MiddlewareServiceFactory  implements FactoryBean<IMiddlewareService> {
    
        private SimpleClassLoader simpleClassLoader=new SimpleClassLoader(new URL[0]);
    
    
        public IMiddlewareService getObject() throws Exception {
            Class clazz=simpleClassLoader.loadClass("com.qiyi.middleware.service.impl.MiddlewareServiceImpl");
            //转型为 systemclassloader 加载的接口类
            return (IMiddlewareService) clazz.newInstance();
        }
    
        public Class<?> getObjectType() {
            return IMiddlewareService.class;
        }
    
        public boolean isSingleton() {
            return false;
        }
    }
    

    middleware-core 中负责具体实现,并且依赖了自己的jar包,这儿作为示例,依赖了 apache common-lang 2.5 版本,与业务层的2.6版本区别对待。

    中间件接口实现类MiddlewareServiceImpl

    public class MiddlewareServiceImpl implements IMiddlewareService{
    
        public String reverse(String str) {
            if(str==null){
                return null;
            }
            else{
                // 2.5 版本的 common-lang jar 包
                return StringUtils.reverse(str);
            }
        }
    }
    

    业务层的使用非常简单,在不引入额外jar包的前提下,达到了透明使用。
    在 spring 配置文件中,添加配置:
    然后直接在业务服务层直接调用:

    @Controller
    @RequestMapping("/demo")
    @Scope()
    public class MyController {
    
        @Autowired
        private IMiddlewareService middlewareService;
    
        @RequestMapping("/reverse")
        @ResponseBody
        public String echo(@RequestParam("s") String str){
            return middlewareService.reverse(str);
        }
    }
    

    参考:http://www.shop988.com/blog/如何实现jar包隔离.html

    展开全文
  • 记录解决spark任务提交集群jar冲突

    千次阅读 2019-06-11 10:22:57
    1、guava包冲突 解决方法:spark各个节点版本为guava-14.0...解决方法:ES集成search-guard安全认证使用到netty包,和spark的netty-all-4.0.29.Final.jar冲突,试过把spark集群的jar包删掉,换我项目的netty包,但是...

    1、guava包冲突在这里插入图片描述
    解决方法:spark各个节点版本为guava-14.0,我把spark各个节点本地jar删掉,上传guava-23.5-jre.jar,即可解决。

    2、netty包冲突
    在这里插入图片描述
    解决方法:ES集成search-guard安全认证使用到netty包,和spark的netty-all-4.0.29.Final.jar冲突,试过把spark集群的jar包删掉,换我项目的netty包,但是spark作业会报错,后来找到一种解决冲突的方法,使用maven的插件对我项目的jar包路径进行更改,不会出现冲突情况。具体代码如下:

    pom文件添加:
       	
    	<plugins>
    	<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>io.netty</pattern>
                                    <shadedPattern>my_netty.common</shadedPattern>
                                </relocation>
                            </relocations>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/maven/**</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    

    最后通过mvn package打包项目就可以了。

    检查打好的jar包,会发现io.netty的路径已经变化了
    在这里插入图片描述
    最后问题已解决

    展开全文
  • 压缩包里面有myself工程。里面只有一个类。可以自己创建两个版本的myself的jar包,然后测试osgi解决jar冲突
  • ssh整合的jar冲突-解决

    2013-12-03 14:33:30
    因为Struts自带的antlr-2.7.2.jar,比Hibernate3.3自带的antlr-2.7.6.jar的版本要低,故要删除前一个低版本的,, struts1.3 和2.1都带有antlr-2.7.2.jar ,,,下面我要把它们都清除了,由于myeclipse 添加的struts性能...
  • 问题:大概意思就是项目中有两个jar,同时是要是想slf4j的接口的,这样程序不知道使用哪个,就会报错了。也不算错,项目照样运行。但是就是报日志错误 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: ...
    问题:大概意思就是项目中有两个jar,同时是要是想slf4j的接口的,这样程序不知道使用哪个,就会报错了。也不算错,项目照样运行。但是就是报日志错误
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/Users/renjianjun/software/mavenLocalRespository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/Users/renjianjun/software/mavenLocalRespository/org/slf4j/slf4j-simple/1.7.25/slf4j-simple-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
    

    解决方式:

    我们需要先找到哪里使用了这些jar,我们去 .pom文件中让项目显示jar依赖关系图
    在这里插入图片描述
    然后找到了依赖,那么我们就选择我们想要保留的 和 要删除的进行操作

    我这里不需要logback 所以,我在logback
    在这里插入图片描述
    然后在pom文件中就会把这个jar抛出掉
    在这里插入图片描述
    然后就好了,大功告成。

    展开全文
  • idea解决maven jar冲突问题

    千次阅读 2019-06-19 14:08:12
    在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了。这也是一个比较操蛋烦人的事情,但是有idea这么个神器,解决maven jar冲突呐还不是随随便便的事情吗? 标注一:...
  • 启动报错 从错误上看是引用的jar出问题了,根据错误的提示,查看引用的jar发现了问题所在 然在pom或gradle中排除这个 再次运行,问题解决!
  • 该文档用于解决在websphere application server 服务部署程序过程中会出现jar冲突问题
  • jar冲突检测工具

    2016-07-21 15:40:36
    打开exe程序,选择项目jar包路径,就可以检测冲突jar包了。
  • eclipse maven项目排除jar冲突

    千次阅读 2019-05-15 10:37:59
    通过maven管理项目jar包的时候,常常会遇到这样的问题,一个依赖导入了多个相关的jar包,而多个依赖导入的jar包存在不兼容的问题,maven在导入依赖的时候提供了排除部分jar的配置,只需要在dependency中加入<...
  • 解决Gradle中jar冲突

    万次阅读 2018-04-27 10:51:22
    如果有两个依赖引用了相同jar包的不同版本时,默认情况下gradle会采用最新版本的jar包,此时可以通过排除选项来排除。首先,看一下依赖一个库时的格式,name也就是module compile group:'com.android.support',name:...
  • was设置共享库解决jar冲突

    千次阅读 2020-04-06 11:47:25
    http的包和commons-httpclient包相冲突,通过共享库改变jar加载顺序
  • idea查看jar冲突和解决方法

    千次阅读 2019-02-18 17:19:00
    如果我们仔细观察上图,会发现在项目依赖图中,有一些红色标记的线,实际上,这些红色标记出来的线所指向的 jar 包,就是项目中冲突jar 包!且在我们点击 jar 包之后,还会显示出多条指向 jar 包的红色虚线,其...
  • 项目中jar 与 tomcat 自带jar 冲突(catalina.jar 和 tomcat-coyote),导致报错: java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet 解决方法:自定义user library ,将冲突jar 放...
  • 构建maven工程时pom.xml中引入依赖时有红色字体,setting处理了,也将jar包的版本号都试了一遍,还是没解决,后来请教大牛,原来是没连网,maven工程加载了一部分jar包,连网之后自动下载的jar包跟之前的冲突,用这...
  • Maven解决jar冲突调试步骤
  • 第三种方法: 如下图可以看到另一个冲突jar包: 它是spring-boot下的包,servlet 2.5那个在springcloud-eureka 下的包,如果想做微服务这两个包都是必选项,可以去官网查看相对应的版本,修改版本号看是否有不...
  • jar冲突检测工具.zip

    2019-06-26 14:29:30
    jar冲突检测工具。使用方法,将需要检测的多个jar包放在同一路径下,打开工具一键检测生成冲突报告。
  • Flume 解决jar冲突

    千次阅读 2022-03-29 09:56:23
    在使用Flume跨集群数据采集的过程中遇到一个错误 ...Ljava/lang/Object;...Flume与hadoop jar冲突 cp guava-27.0-jre.jar ~/awz/soft/apache-flume-1.7.0-bin/lib/ 再将原来Flume的guava包删除 ok .
  • 主要介绍了Maven jar冲突的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,870
精华内容 37,548
关键字:

jar冲突