精华内容
下载资源
问答
  • 开发项目,多多少少都会引进一些第三方jar或者aar资源文件,方便开发个性化功能,但这样就经常会出现冲突、文件冲突、重复导入资源或者导入俩个不同的包中包含有相同的文件资源呢!后果导致编译失败,提示错误! ...

           开发项目,多多少少都会引进一些第三方jar或者aar资源文件,方便开发个性化功能,但这样就经常会出现包冲突、文件冲突、重复导入资源或者导入俩个不同的包中包含有相同的文件资源呢!后果导致编译失败,提示错误!
    下面就来加讲解下我遇到问题及解决方法:

    1. 文件冲突

    文件错误提示

           一般类似这样的Error:Execution failed for task ‘:app:transformResourcesWithMergeJavaResForDebug’.> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/maven/com.squareup.okio/okio/pom.xml File1: C:\Users\WX_JIN.gradle\caches\modules-2\files-2.1\com.squareup.okio\okio\1.6.0\98476622f10715998eacf9240d6b479f12c66143\okio-1.6.0.jar File2: D:\Android\workspace\wxj\YK\app\build\intermediates\exploded-aar\YK\umenglibrary\unspecified\jars\classes.jar
    上面提示Duplicate files copied in APK META-INF/maven/com.squareup.okio/okio/pom.xml
    重复这个文件,我们只要去掉一个或者忽略一个就行了
    提示错误类似这个

    解决方案

           在主项目中添加build->android->添加packagingOptions exclude 包含重复的文件
    解决方案截图

    2. jar冲突

    冲突提示

    错误提示

    解决方案

    解决一
    解决二
    使用上面这种忽略掉重复的依赖包

    展开全文
  • 使用URLClassLoader加载不同Jar包中的相同包相同类名的类 开发中会遇到这种情况,使用一项功能需要依赖jar,然而一段时间后这些升级,名和类名均不变的情况下功能发生变化。旧的jar依然需要使用,而新功能却...

    使用URLClassLoader加载不同Jar包中的相同包名相同类名的类

    开发中会遇到这种情况,使用一项功能需要依赖jar,然而一段时间后这些包升级,包名和类名均不变的情况下功能发生变化。旧的jar依然需要使用,而新功能却需要使用新升级的jar。这时如果依赖两个包,使用时会造成冲突。因此需要进行jar隔离。有很多的隔离框架可以使用,如jarlinks。本文将演示通过URLClassLoader加载器来进行隔离的基本方法,而实应用中的的一些隔离框架中也会看到此种方式的使用。

    首先原有系统内部依赖version782.jar包,并用到该包中的RequestHead类。而此时又希望用到version713.jar包中的RequestHead类。直接增加maven依赖会产生冲突,这里通过URLClassLoader进行加载。

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import xxx.RequestHead;
    import org.apache.commons.codec.binary.Hex;
    
    import java.io.File;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;
    
    public class ClassLoadTest {
    
        public static void main(String[] args) throws Exception {
            URL url = new File("/version713.jar").toURI().toURL();
            // 创建URLClassLoader,并设置父加载器为null,这样通过加载器加载
            // 类时就不会通过父加载器去通过classpath中加载version782.jar
            // 中的RequestHead
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, null);
    
            // 加载version713.jar包中的RequestHead类
            Class<?> clz = urlClassLoader.loadClass("xxx.RequestHead");
            // 加载序列化工具类,由于要通过反射调用ProtoBufferCore中的方法
            // 而且需要指定Class参数,这个参数需要与ProtoBufferCore使用相同
            // 的类加载器,因此后续加载参数CtripBusinessBean
            Class<?> pb = urlClassLoader.loadClass("xxx.ProtoBufferCore");
            // 加载参数CtripBusinessBean,调用ProtoBufferCore方法时使用
            Class<?> ctripBizBean = urlClassLoader.loadClass("xxx.CtripBusinessBean");
    
            RequestHead head782 = new RequestHead();
            Object head713 = clz.newInstance();
    
            Object pbObject = pb.newInstance();
    
            System.out.println(pbObject);
            System.out.println(JSON.toJSONString(head713, SerializerFeature.WriteNullStringAsEmpty));
            System.out.println(JSON.toJSONString(head782, SerializerFeature.WriteNullStringAsEmpty));
    
            clz.getField("appId").set(head713,"999111");
            // 这里进行方法调用时,执行参数上文中加载的ctripBizBean,
            // 这样才能保证正确调用
            Method toByteArrayMethod = pb.getMethod("toByteArray",ctripBizBean);
            String hex = Hex.encodeHexString((byte[]) toByteArrayMethod.invoke(pbObject,head713));
            System.out.println(hex);
        }
    }

    参考

    java虚拟机规范5.3节

    展开全文
  • maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverbose image.png四种解决方式:1、第一声明优先原则:在pom.xml配置文件中,如果两个名称相同版本不同的依赖声明,那么先写的会生效。所以,先声明...

    maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverbose

    image.png

    四种解决方式:

    1、第一声明优先原则:

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。

    所以,先声明自己要用的版本的jar包即可。

    2、路径近者优先:

    直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。

    3、排出原则:

    传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。

    例子:

    org.apache.struts

    struts2-spring-plugin

    2.3.24

    org.springframework

    spring-beans

    4、版本锁定原则(最常使用)

    在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。

    例子:

    4.2.4.RELEASE

    5.0.7.Final

    2.3.24

    org.springframework

    spring-context

    ${spring.version}

    IntelliJ IDEA Maven 组件界面

    image.png

    如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:

    第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目。一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4 的依赖区中没有看到最新写的依赖的话,可以尝试点击此按钮进行项目的重新载入。

    第六个按钮:Execute Maven Goal 弹出可执行的 Maven 命令的输入框。有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮。

    第九个按钮:Show Dependencies 显示项目依赖的结构图,可以方便我们直观项目的依赖包情况。这个功能有些具体的操作下面会专门进行讲解。

    如上图标注 2 所示,常用的 Maven 生命周期的命令,通过双击对应的命令来执行项目编译、打包、部署等操作。

    如上图标注 3 所示,为我们在 pom.xml 中配置的插件列表,方便调用插件。

    如上图标注 4 所示,为我们在 pom.xml 中配置的依赖包列表。

    如上图标注 5 所示,为常见的 Java Web 在 Maven 下的一个项目结构。

    大致了解过后,看怎么查看所有jar包的依赖关系。

    image.png

    image.png

    图中的红色实线就算是冲突的,可以右键,排除,就自动在pom文件里面exclude。

    展开全文
  • 在pom.xml配置文件中,如果两个名称相同版本不同的依赖声明,那么先写的会生效(同个pom.xml文件)。 所以,先声明自己要用的版本的jar包即可。 路径近者优先 直接依赖优先于传递依赖,如果传递依赖的jar包版本...

    总共有四种解决方式:

    第一声明优先原则

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效(同个pom.xml文件)。 

    所以,先声明自己要用的版本的jar包即可。 

    路径近者优先

    直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。 

    排除原则

    传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。 

    如:

    <dependency>
    	<groupId>org.apache.struts</groupId>
    	<artifactId>struts2-spring-plugin</artifactId>
    	<version>2.3.24</version>
    	<exclusions>
    	  <exclusion>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-beans</artifactId>
    	  </exclusion>
    	</exclusions>
    </dependency>

    版本锁定原则

    在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。 

    如:

    <!-- 锁定版本 -->
    <dependencyManagement>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>4.2.4.RELEASE</version>
    		</dependency>
    	</dependencies>
    </dependencyManagement>

     

    展开全文
  • maven仓库的ear里面很多个相同的jar(只是包含不同的:版本+时间戳)问题描述: 发现ear里面很多个相同的jar,只是包含不同的:版本+时间戳,如下图所示:(例如:itoo-basic-api很多相同的jar,只是包含不同的:...
  • maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverboseimage.png四种解决方式:1、第一声明优先原则:在pom.xml配置文件中,如果两个名称相同版本不同的依赖声明,那么先写的会生效。所以,先声明自己...
  • maven 依赖jar包时版本冲突的...在pom.xml配置文件中,如果两个名称相同版本不同的依赖声明,那么先写的会生效。 所以,先声明自己要用的版本的jar包即可。 2、路径近者优先: 直接依赖优先于传递依赖,如果传递...
  • 1、在pom.xml配置文件中,如果两个名称相同版本不同的依赖声明,那么先写的会生效。  所以,先声明自己要用的版本的jar包即可。  2、直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突...
  • maven依赖jar包时版本冲突解决方案

    千次阅读 2020-06-30 16:26:51
    jar包版本是以groupId+artifactId为坐标的,在groupId+artifactId相同的情况下version不同代码不同的版本,一般都是version的不同导致的jar冲突。 同一个产品除非是大版本的升级,否则groupId+artifactId一般不会变...
  • 前言在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果两个包依赖相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突。也就是说,在理论上使用Gradle一般情况...
  • 时候依赖会出现相同的artifact却不同版本,相互存在冲突,这时就需要exclude某个版本。 试了在命令行工程目录下执行mvn dependency:tree可以出来文本的依赖关系,但是不会把一个artifact的每处依赖都显示出来,...
  • 经过排查,是因为在线上两个项目,分别使用了不同jar包的解密方法,但是解密方法所在类路径,两者完全相同,解密所用内容不一致 原因 对于java来说,如果运行中依赖存在两个一模一样类,类路径一致,就会发生...
  • Maven查找依赖树,解决jar包冲突问题

    万次阅读 2016-01-12 20:06:26
    时候依赖会出现相同的artifactId却不同版本,相互存在冲突,这时就需要exclude某个版本。   试了在命令行工程目录下执行mvn dependency:tree可以出来文本的依赖关系,但是不会把一个artifact的每处依赖都...
  • 如何实现一个工程中不同模块加载不同版本同名jar包? 曾是阿里面试时候遇到一个面试题。当时就有点晕,如果是平时遇到这样问题肯定是统一加载相同版本就好了。 而如果系统特别庞大依赖冲突繁多,...
  • 在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果两个包依赖相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突。 也就是说,在理论上使用Gradle一般情况下...
  • 时候依赖会出现相同的artifact却不同版本,相互存在冲突,这时就需要exclude某个版本。试了在命令行工程目录下执行mvn dependency:tree可以出来文本的依赖关系,但是不会把一个artifact的每处依赖都显示出来,只会...
  • 时候依赖会出现相同的artifact却不同版本,相互存在冲突,这时就需要exclude某个版本。 IntelliJ IDEA,该如何找某个artifact的全部依赖关系? 该工具个Maven Projects窗口,一般在右侧能够找到,如果没有可.....
  • Android Studio多个Module依赖相同的库时对版本号进行统一配置在Android项目中,一个项目经常会依赖其他的一个甚至多个库文件,在这种依赖的...所以就另外一种解决方案 将所有的相同的jar包修改成相同的版本号 就...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

不同的jar包有相同的依赖