Library Publication 是 Gradle 在0.9.0 时增加的一个新特性,它的作用是让Lib也能发布不同的版本
在这之前,Lib只能发布release版本,你的项目中依赖的所有Lib也都只能是relaese版本的。这种做法看起来很合理,被依赖的库当然应该是release的,debug状态下怎么给其他项目提供依赖呀?但在实际多模块项目中,被依赖的库只是项目中普普通通的一部分,库和项目同时被开发被调试,debug状态的Lib也是非常正常的,于是很早就有人给Google提了一个issue:https://code.google.com/p/android/issues/detail?id=52962 ,Google工程师便在gradle的0.9.0版本中增加了Library Publication特性来处理这个问题,不过好像直到1.0才完全处理好
 
(转载请注明:博客园-阁刚广志,地址:http://www.cnblogs.com/bellkosmos/p/6437171.html )
 
对我来说,我写的很多工具包都会打印Log,而工具包自然会放在通用的模块里,所以我当然希望Log能根据模块当前的buildtype来决定是否打印,于是我对这个common lib 使用了Library Publication这个特性
Library Publication 不会改变之前的构建过程,只是在gradle脚本中增加了一些配置,就实现了Lib的多版本发布
Google工程师的实现思路非常简单:
  1. 还是只需要选择application的variant就可以直接打包
  2. 改动在于,让 [application依赖的library的variant] 被 [application的variant] 控制
你具体的使用方式是也非常简洁:
  1. 在library中设置让library发布自己的全部variant:android.publishNonDefault = true
  2. 然后在application中的reference中标明不同的 [application的variant] 依赖的不同的 [library具体的variant] :debugCompile project(path: ':Library', configuration: 'debug')
 
但我在实际项目中使用时,发现直接就同步不过去,报错信息是“more than one library with package name:XXX”
正常情况下,Gradle会处理好重复依赖的问题,但是这里居然会报这个错误,那一定是我们在Library Publication时出了问题
原来还是因为我的项目中依赖关系有些乱,造成了一个复杂的构建情况,导致了构建问题,这个问题的原理说起来非常简单:
  1. 假设有这样一个多模块项目:
    1. 应用A依赖库B和库C,同时库B和库C又都依赖库D
    2. 在库D上使用了新特性发布全版本,然后在库C上使用新特性控制:当C是debug的时候D也是debug、C是release的时候D也是release
    3. 同时在C上也发布全版本,A通过新特性控制C的版本就像C控制D一样
    4. 而A对B不做控制,B对D也不做控制
  2. 这时,但是如果你进行debug构建,就会出现问题
  3. 因为当应用A是debug的时候,库C是被新特性控制成debug的了,同样D也是debug,另一边库B只默认构建release版本,就自然使用了release,而库B依赖的库D因为是普通依赖,自然也是默认的release
  4. 这样整个项目中就会存在一个debug的库D和一个release的库D,Gradle就报了构建错误:more than one library with package name:XXX
  5. (如果你对应用A进行release构建,不会有问题,可以自己推理一下原因)
 
知道原因之后解决这个问题就可以直接对症下药了:让库B也发布全版本,让项目A控制库B的版本,让库B控制库D的版本 

Library Publication 时遇到 "more than one library with package name" 错误的解决方法的更多相关文章

  1. 【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法

    问题描述 在PHP项目部署在App Service后,上传文件如果大于1MB就会遇见 413 Request Entity Too Large 的问题. 问题解决 目前这个问题,首先需要分析应用所在的 ...

  2. 在使用pydelicious时出现HTTP Error 500: Internal Server Error的错误的解决方法:

    问题:在学习<集体智慧编程>的过程中,第二章中如果你遇到了pydelicious.PyDeliciousException: HTTP Error 500: Internal Server ...

  3. Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法

    问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...

  4. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!&&在eclipse.ini中为eclipse指定jdk启动

    参考:http://blog.csdn.net/zyz511919766/article/details/7442633 http://blog.sina.com.cn/s/blog_028f0c1c ...

  5. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

    启动 Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误的解决方法 http://blog.csdn.net/z ...

  6. MyEclipse+Tomcat 启动时出现A configuration error occured during startup错误的解决方法

    MyEclipse+Tomcat 启动时出现A configuration error occured during startup错误的解决方法 分类: javaweb2013-06-03 14:4 ...

  7. Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法

    Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法 在用tomcat运行WEB项目,并且使用了StringUtils包的时候,会出现 jav ...

  8. jquery-easyui的datagrid在checkbox多选时,行选中不正确应,去除高亮的解决方法

    jquery-easyui的datagrid在checkbox多选时,行选中不正确应,去除高亮的解决方法 工作中用到一个具有多选功能的easyui-datagrid在处理cell的点击事件时,不同 ...

  9. 安装Office时出现windows installer服务不能更新一个或多个受保护的windows文件错误的解决方法

    今天在Windows XP上安装Microsoft Office 2010时,总是遇到“Windows Installer服务不能更新一个或多个受保护的windows文件,安装失败,正在回滚更改”提示 ...

随机推荐

  1. CopyTransform

    // TransformCopier.cs v 1.1 // homepage: http://wiki.unity3d.com/index.php/CopyTransform using Unity ...

  2. gcc的选项

    -g: 是一个编译选项,即在源代码编译的过程中起作用,让gcc把更多调试信息(也就包括符号信息)收集起来并将存放到最终的可执行文件内. -rdynamic:   却是一个 连接选项 ,它将指示连接器把 ...

  3. django初体验 学习笔记

    django环境搭建     1.安装Python     2.ipython         sudo apt-get install ipython         sudo pip instal ...

  4. Android Studio Error:Connection timed out: connect.解决方案

    遇到了这样的错误: Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure the ...

  5. 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知

    完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...

  6. java基础---->Runtime类的使用(一)

    这里面我们对java中的Runtime类做一个简单的了解介绍.若不常想到无常和死,虽有绝顶的聪明,照理说也和呆子一样. Runtimeo类的使用 一.得到系统内存的一些信息 @Test public ...

  7. 如何清除 DBA_DATAPUMP_JOBS 视图中的异常数据泵作业

    解决方案 用于这个例子中的作业: - 导出作业 SCOTT.EXPDP_20051121 是一个正在运行的 schema 级别的导出作业 - 导出作业 SCOTT.SYS_EXPORT_TABLE_0 ...

  8. sencha touch 视图(view) activate与deactivate事件探讨

    在sencha touch2.2中采用card布局 之前的需求是考虑show,hide事件发现不可取 http://www.cnblogs.com/mlzs/archive/2013/06/13/31 ...

  9. C# IO流的操作(一)

    C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...

  10. asp.net搭建mybatis开发环境

    mybatis其实就是ibatis的升级版本不仅能在java上使用,asp.net照样可以使用mybatis来开发程序.mybatis是一个比较小巧的ORM框架,类似hibernate.自己试了一下用 ...