使用maven local

时间:2015-07-12 21:13:37

标签: android maven gradle android-gradle android-library

我正在尝试建立一个包含两个android库项目(aar)的新项目。我们称他们为foobar

由于在撰写本文时这是全新的,我使用的是Android Studio 1.2.2,Android Build Tools 1.1,Gradle Wrapper 2.2.1。

foo取决于bar,为了让Gradle构建工作,我需要从以下来源指定依赖项:

dependencies {
    compile project(':bar')
}

我需要至少将foo发布到本地maven存储库,以便可以通过单独的应用程序项目baz来获取它,这取决于foobaz位于一个完全独立的项目和Gradle构建中。

我通过使用maven插件并将以下内容添加到foo的build.gradle中来实现:

task uploadArchives(type: Upload) {
    repositories.mavenInstaller {
        configuration = configurations.getByName(Dependency.DEFAULT_CONFIGURATION)
        pom.groupId = "com.example"
        pom.artifactId = "foo"
        pom.version = "0.0.2-SNAPSHOT"
    }
}

并像往常一样在baz版本中包含maven依赖项,如下所示:

dependencies {
    compile 'com.example:foo:+'
}

现在我遇到的问题是baz应用程序在运行时失败,因为它缺少bar的依赖性! (ClassNotFoundException异常)。 检查发布到maven local的foo aar我可以看到它中没有任何barbar中也没有引用pom } foo

如何让Gradle从上述信息中为foo中的pom添加适当的依赖关系信息?

我尝试通过将foo指定为maven依赖项来替换bar的构建:

dependencies {
    compile 'com.example:bar:+'
}

但在这种情况下,barfoo的Gradle构建都在配置阶段失败,因为当然在maven local上找不到bar(它没有已经建成了!) - 记住它们都在一个多项目设置中。

解决这个问题的正确方法是什么? 对于像这样的多项目和Android库项目设置的良好实践是否有任何指针?

我也对mavenmaven-publishing插件的存在感到困惑。什么是用于Android库设置的最合适的标准?

我很抱歉在一篇文章中包含多个问题,我希望当我清楚地了解正确的方向时,我可以编辑并使其成为一个更有帮助的问题/答案,可以帮助那些像我一样迷失的人。

谢谢!

1 个答案:

答案 0 :(得分:2)

好吧,经过一场激烈的战斗,但仍然没有完全坚定的细节,我想我发现了一些问题。

从我收集的内容中,将bar指定为foo的源项目依赖项是正确的。理论上,如果所有内容都设置正确,maven插件应该能够在pom文件中构建适当的依赖项。

我遇到的麻烦在于正确配置maven发布。

到目前为止,我能够得出的结论是,使用mavenInstaller事情很容易,但pom形成错误(缺少依赖关系)。另一方面,如果我使用mavenDeployer,则会生成带有依赖项的pom。它只花了我很长时间才能使它工作,因为如果没有正确设置它会失败,并且我不知道为什么会这样做。

对我有用并且希望可以帮助他人的一个组合就是:

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: mavenLocal().url)
            }
        }
    }
}

我希望这有助于其他失去的灵魂,并有助于在这个问题上更加明确