Gradle / Maven:如何使用in-developement依赖项?

时间:2016-02-16 08:34:27

标签: java maven gradle

上下文

我正在开发一个Gradle项目,该项目依赖于我创建的外部库。目前,我在project(':lib')上使用了一个简单的依赖。

但这还不够,我需要发布和分发库作为独立组件,版本化和记录。我将安装Apache Archiva并将它们发布到内部maven存储库,因此我可以明确依赖'com.company:lib:1.0'

问题:

在开发过程中,我将同时处理图书馆和项目。如何在不发布库的情况下测试我的代码?以前依赖于project()的我的应用程序现在将取决于特定版本。但在开发过程中,我想使用本地代码。

您知道处理此问题的最佳流程是什么?

2 个答案:

答案 0 :(得分:2)

一种方法是有条件地添加依赖项。因此,对于本地构建(IDE),您希望通过源构建依赖项。然后,您可以通过让您的版本将param传递给构建来区分您的版本构建。

dependencies {
    if (project.hasProperty('release')) {
        compile 'com.company:lib:1.0'
    } else {
        compile project(':lib')
    }
}

然后在你的发布版本中使用来自nexus的lib:
$ gradle -Prelease=true clean build

如果您想从项目内部使用lib构建项目:
$ gradle clean build

答案 1 :(得分:0)

Gradle's documentation23.8.3.1部分)中提供了此问题的正确答案,如下所示:

configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module("com.company:lib") with project(":lib")
        substitute module("com.company:lib2") with project(":lib2")
    }
}

就个人而言,我使用了以下代码,这使得所有-SNAPSHOT版本都可以从本地项目而不是远程存储库中获取(如果有本地项目可用):

configurations.all {
    resolutionStrategy.dependencySubstitution {
        all { dependency ->
            if (! dependency.requested.version.endsWith('SNAPSHOT'))
                return
            if (subprojects.find { p ->p.name == dependency.requested.module })
                dependency.useTarget project(":" + dependency.requested.module)
        }
    }
}