2014-09-24 41 views
10

我正在研究一个包含两个Android库项目的项目。当我将这些库上传到我的Maven回购库(Nexus)时,生成的pom在依赖项中不包含<type>aar</type>元素。Android库项目瞬态依赖松散AAR类型

这里是我的依赖关系树

* App1 
\ 
    * lib1 
    |\ 
    | * lib2 
    * Other libs 

您可以将这个图,我app取决于lib1,这取决于lib2中看到的。这两个库都是Android库项目,因此是AAR。

LIB1 /的build.gradle

apply plugin: 'com.android.library' 
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' 

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 

    defaultConfig { 
     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion 20 
     versionCode 1 
     versionName "1.0" 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    provided project(':lib2') 

    compile 'com.squareup.picasso:picasso:2.3.3' 
} 

LIB2 /的build.gradle

apply plugin: 'com.android.library' 
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' 

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 

    defaultConfig { 
     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion 19 
     versionCode 1 
     versionName '1.0' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:19.+' 
    compile 'com.squareup.retrofit:retrofit:1.6.1' 
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' 
    compile 'com.squareup.okhttp:okhttp:2.0.0' 
} 

通知如何Lib1包括Lib2作为project()依赖性。

现在,当我使用Chris Banes的优秀gradle-mvn-push插件部署时,一切都按预期工作。在生成的pom.xml中我只注意到一个奇怪的地方。

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>lib2</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 
    ... 
</dependencies> 

注意,mavenDeployer插件在依赖留出了<type>aar</type>元件时,它产生的POM。

在我的应用程序的项目(这是一个Maven项目),我有这样的依赖上市:

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>lib1</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>aar</type> 
    </dependency> 
    ... 
</dependencies> 

当试图用Maven构建这个,我得到以下错误。

Could not resolve dependencies for project com.example:app:apk:1.0.0-SNAPSHOT: The following artifacts could not be resolved: com.example:lib2:jar:0.0.1-SNAPSHOT 

注意它是如何寻找jar版本的库。我相信,由于mavenDeployer插件没有在生成的pom的依赖列表中生成<type>aar</type>,因此maven默认寻找jar。

有谁知道如何构建Android库项目,其中包括与Gradle的临时依赖项?

+2

同样的问题在这里。 – sarfata 2014-10-10 01:41:37

回答

0

只需用任何文本编辑器将aar添加到pom即可。之后,打开一个控制台到项目的根目录(pom所在的位置)并运行“mvn clean install”。 aar神器将被生成并部署到你的maven回购。

无论如何,使用Maven创建aar库要容易得多。只需使用任何android库原型创建一个Maven项目(de.akquinet的很不错,但是您必须使用3.8.2到3.9之间的插件版本,http://mvnrepository.com/artifact/de.akquinet.android.archetypes)。只需创建项目,添加库,然后运行命令“mvn clean install”将它们安装到本地maven目录中。之后,只需使用它们作为正常的依赖关系。

+0

这个问题是不是在创建库项目,它是与其他AAR库的依赖库项目,使用mavenDeployer(uploadArchives)部署时,不会保留在POM dependency元素的 AAR一部分,所以行家试图解决这些瞬态依赖作为罐子(默认)。 – rharter 2015-01-15 18:23:06

+0

我明白了。但假设pom中的其他所有内容都可以,只需添加缺少的类型并手动运行maven即可生成空闲空间。 – 2015-01-15 20:50:25

+0

当然,但在这一点上,我手动构建我的依赖,这否定了,我用maven的自动依赖管理效益。我需要能够分发依赖于其他库的库,而不需要每个用户都需要手动下载依赖关系,修改POM并在本地构建它们。 – rharter 2015-01-15 21:02:42

0

尝试gradle-fury。它修复了所有这些......呃......东西。特别是由gradle生成的无效和/或不准确的pom。确定的工作解决方案发布到sonatype oss/maven central。没有手动pom编辑,pgp签名支持等等。

网站:https://github.com/gradle-fury/gradle-fury

具体来说,需要行家支持gradle这个脚本,做所有的工作适合你。所有通常在pom中的东西都存储在gradle.properties中。支持android变体,war文件(很快修复了distZip),javadocs和源代码jar等等。

声明,我的工作

编辑:一个信息的小技巧。尽管愤怒的确为AAR库注入了依赖关系和正确的类型,但gradle-android插件(谷歌所做的东西)并不尊重依赖部分并忽略它。基本上不支持AAR项目的传递依赖性。不知道为什么