使用依赖 pom/iml 文件手动添加 aar

Posted

技术标签:

【中文标题】使用依赖 pom/iml 文件手动添加 aar【英文标题】:Manually adding aar with dependency pom/iml file 【发布时间】:2016-04-24 15:59:16 【问题描述】:

由于我不能使用私有 maven 来共享我的库,我正在考虑共享 aar 并导入另一个项目。 当 aar 和 jar 文件不包含任何依赖项时,就会出现问题。因此,一旦我在 android studio 中手动导入 aar(使用 Import .JAR/.AA Package),就没有依赖关系,我必须再次手动添加所有依赖关系。 我已经通过 gradle 任务生成了一个 pom 文件,虽然我找不到任何方法可以在项目中手动导入它。

关于“导入.JAR/.AA包”自动生成的build.gradle文件是:

configurations.maybeCreate("default")
artifacts.add("default", file('TestSample_1.0.0.aar'))

有没有办法添加 pom/iml 文件呢?类似:

artifacts.add("default", file('pomDependencies.xml'))

【问题讨论】:

根据我的经验,你做不到。使用 aar 文件,您必须在 build.gradle 中手动添加依赖项。 感谢您的回复@Gabriele Mariotti。虽然我有一个问题,因为 gradle 在从 maven 存储库编译时知道它,所以执行以下操作: compile "com.lib.testsample:testSample:1.0.0" 使用 maven repo gradle 搜索描述依赖关系的 pom 文件。但是使用平面目录导入aar文件我不知道添加相同pom文件的方法。 当您说private maven 时,您是指像 Nexus 或 Artifactory 这样的存储库吗?您也可以随时发布到基于文件系统的 repo,有点像您的本地 .m2 目录,然后从同一台机器上的不同构建中使用您的 aar,从而获得传递依赖的所有好处。这对你有用吗? 嗨@RaGe,这很有趣,所以我可以发布到本地文件系统,然后其他人可以使用不同机器上的分布式目录以及所有依赖项? 【参考方案1】:

1。发布

在您的 aar 项目中,添加 maven-publish 插件并添加必要的插件配置。

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'

...

dependencies 
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.novoda:bintray-release:0.2.7'

    
...

publishing 
    publications 
        maven(MavenPublication) 
            groupId 'com.example' //You can either define these here or get them from project conf elsewhere
            artifactId 'example'
            version '0.0.1-SNAPSHOT'
            artifact "$buildDir/outputs/aar/app-release.aar" //aar artifact you want to publish

            //generate pom nodes for dependencies
            pom.withXml 
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each  dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                
            
        
    
    
    //publish to filesystem repo
    repositories
        maven 
            url "$buildDir/repo"
        
    

注意事项:

    我们使用的是自定义 maven 发布,因此您必须使用 artifact 子句定义发布的内容

    我们必须自己生成 pom,在上面的代码中我使用了所有编译配置依赖项,您可能希望确保涵盖所有您关心的配置。

运行gradle publish 将发布到repo 文件夹的maven repo 结构,然后您可以从不同的项目中使用它。

2。使用已发布的 .aar

在不同的android项目中,使用#1中发布的aar: 在*** build.gradle 中:

allprojects 
    repositories 
        jcenter()
        maven 
            url "D:/full/path/to/repo"
        
    

将早期存储库的路径添加为 Maven 存储库。请注意,您可能必须使用完整路径,因为 $buildDir 对于此项目具有不同的值。在您的应用 build.gradle 中:

dependencies 
    ...
    other dependencies
    ...
    implementation ('com.example:example:0.0.1-SNAPSHOT@aar')transitive=true

transitive=true 是从 pom 文件中获取传递依赖项所必需的。

【讨论】:

发布到本地 maven,然后从该目录编译完全有帮助,因为我可以随时与所有依赖项共享该目录。谢谢@RaGe 顺便说一句,这有点 hacky,但可以在 git 上托管一个 maven repo 如错误所示,出版物应为MavenPublication,正如我上面的代码所示。 @Kaveri 你能解决这个问题吗,因为我也遇到了同样的问题。 仅供参考,如果您使用 'implementation' 添加依赖项,请使用 'configurations.implementation' 而不是 'configurations.compile' :)【参考方案2】:

事情发生了一些变化,以下是最新版本的 gradle 的操作方法

本地创建包(aar 和 pom)

修改您的库build.gradle 文件以包含

apply plugin: 'maven-publish'

android 
    ...
    ...


dependencies 
    ...
    ...


publishing 
    publications 
        maven(MavenPublication) 
            groupId 'com.domain' //You can either define these here or get them from project conf elsewhere
            artifactId 'name'
            version '1.0.0'
            artifact "$buildDir/outputs/aar/sdk-release.aar" //aar artifact you want to publish

            //generate pom nodes for dependencies
            pom.withXml 
            def dependenciesNode = asNode().appendNode('dependencies')
            configurations.implementation.allDependencies.each  dependency ->
                if (dependency.name != 'unspecified') 
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                
            
        
    

    //publish to filesystem repo
    repositories
        maven 
            url "$buildDir/repo"
        
    

从终端运行

./gradlew clean
./gradlew build
./gradlew --console=verbose publishToMavenLocal

aarpom 文件已在 $HOME/.m2/repository/ 创建

如何从不同的项目加载库

通过以下方式修改项目的build.gradle

allprojects 
    repositories 
        maven 
            url "/Users/username/.m2/repository/"
        
        google()
        jcenter()
    

您可以使用$rootDir 并设置相对路径。

将库作为依赖添加到您的应用模块build.gradle

implementation 'com.domain:name:1.0.0'

【讨论】:

更好和更新的方法 我的maven文件夹生成了,但是没有aar文件。有什么帮助吗? 哇,我不敢相信 Gradle 让生成包含依赖项的 POM 变得如此笨拙。 @aviran 这个答案应该被检查为正确的!非常感谢兄弟!

以上是关于使用依赖 pom/iml 文件手动添加 aar的主要内容,如果未能解决你的问题,请参考以下文章

依赖项目中引入aar包,编译时提示找不到引入的aar包

关于打Android aar离线包的一些经验分享

Android Studio在多Module中依赖aar的配置问题

Android 多module情况下module依赖aar问题处理

如何将本地 aar 依赖项添加到 bintray 发布的库中?

如何手动从 jitpack.io 下载 aar 和 pom 文件?