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. fork(), waitpid()

    NAME fork - create a child process SYNOPSIS #include <unistd.h> pid_t fork(void); RETURN VALUE ...

  2. Android5.x新特性之 Toolbar和Theme的使用

    Toolbar 你还在为Android 的ActionBar的文字不能随意设置位置而烦恼么?你还在为ActionBar不能自定义添加自己的布局而烦恼么?现在告诉你一个好消息,当你看到这篇文章时,就不必 ...

  3. Kafka 0.11客户端集群管理工具AdminClient

    很多用户都有直接使用程序API操作Kafka集群的需求.在0.11版本之前,kafka的服务器端代码(即添加kafka_2.**依赖)提供了AdminClient和AdminUtils可以提供部分的集 ...

  4. Excel 导入遍历

    package com.founder.ec.cms.service.impl; import com.founder.ec.cms.service.ProductListImportService; ...

  5. c语言学习笔记---符号

    专题2.符号的技巧: 1) 注释符与转义符 vC语言中的接续符(\)是指示编译器行为的利器: 接续符的使用:编译器会将反斜杠剔除,嗯在反斜杠后面的字符自动解到前面的一行. 在接续单词时,反斜杠之后不能 ...

  6. 【整理】LINUX下使用CMAKE安装MYSQL

    原文地址:http://www.cppblog.com/issay789/archive/2013/01/05/196967.html 一.安装 m4 下载地址: http://files.w3pc. ...

  7. JS - 查找同辈中的对象

    今天在使用parent().find(".a:first")的时候,发现查找结果非正常按照顺序来的.有点递归的感觉,从底层往上. 因为需要的是同级的对象,所以去查了一下jquery ...

  8. js元素闪动效果

    <img src="http://yjy.allbring.com/UpLoadFiles/head/p1_20140326104945_17-10164142709.jpg" ...

  9. 【资源大全】.NET资源大全中文版(Awesome最新版)

    算法与数据结构(Algorithms and Data structures) 应用程序接口(API) 应用程序框架(Application Frameworks) 模板引擎(Application ...

  10. Win8交互UX——用于 Windows 的触摸交互

    用于 Windows 的触摸交互   Windows 8.1 提供一组在整个系统中使用的简单触摸交互功能.一致地应用此触摸语言可让用户对你的应用感觉已经很熟悉.通过让你的应用更容易学习和使用,可提高用 ...