Gradle Maven Bom Properties

时间:2016-12-18 04:48:16

标签: java gradle groovy

我正在考虑从maven迁移到gradle,在我们当前的设置中,我们有一个定义所有版本依赖关系的主pom。

项目名称是master-pom,并且包含以下代码段:

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>${commons-beanutils-version}</version>
        </dependency>

.... 然后在文件中我们按照以下几行定义:

<properties>
    <commons-beanutils-version>1.9.1</commons-beanutils-version>
</properties>

现在,这就是我到目前为止:

 plugins {
    id "com.github.johnrengelman.shadow" version "1.2.4"
    id "nebula.dependency-recommender" version "3.7.0"
}


apply plugin: 'java'
apply plugin: 'war'

apply plugin: 'nebula.dependency-recommender'
apply plugin: "com.github.johnrengelman.shadow"




version = '1.0.0-SNAPSHOT'
sourceCompatibility =  '1.8'

description = """best-service-ever"""



repositories {
       mavenLocal()
       maven { url 'https://repo.server.com/nexus/content/groups/public'
          credentials {
               username 'username'
               password nexusPassword
          }
    }
       mavenCentral()
       jcenter()


}

dependencyRecommendations {
   mavenBom module: 'biz.company.name:master-pom:1.0.0-SNAPSHOT'
}



dependencies {
          ... some dependencies
          compile 'biz.company.name:db-schema'
}

此时它将获取名为$ {db-version}的版本并使用build-maven中正确定义的版本。问题是,我需要用特定版本覆盖该版本。

我尝试将值放在gradle.properties中,但是存在问题。

gradle不支持db-version,因为它将其解释为算术运算。我改为尝试将值定义为

db_version = 0.0.1700

这似乎有效,但我如何设置它以覆盖$ db-version值。我想避免在每个工件中明确设置版本:

我的理想情况是允许我简单地覆盖来自bom文件的属性。

之前是否有人遇到此问题?或者有一个解决方法?

2 个答案:

答案 0 :(得分:0)

这可能是部分答案。

我确实发现这种模式看似有效,虽然它有点脆,有点过于冗长。我真正想做的就是说。

${common-service-version} = MyVersionNumber  (which is defined in gradle.properties)

示例修复:

dependencyRecommendations {
   mavenBom module: 'biz.company.name:master-pom:1.0.0-SNAPSHOT'
   /* Override properties from mavenBom */
   map recommendations: [ 'biz.company.name:shared-common-service': services_common_global_version,
    'biz.company.name:services-core': services_common_global_version,
    'biz.neustar.ms:test-services-common': services_common_global_version,
    'biz.company.name:mip-db-schema':  db_version,
    'biz.company.name:services-api': services_api_version
   ]
}

虽然您必须以某种方式重新定义依赖项,但这确实有效。如果有人有更好的模式,请告诉我。

答案 1 :(得分:0)

在这里找到了这个主意:https://dzone.com/articles/specifying-gradle-build,对其进行了一些修改,以使其可以在我当前的gradle版本中使用(不确定是否是问题所在,但无论如何……)

在gradle中指定通用版本基本上可分为两个简单步骤:

  1. 创建文件gradle.properties(如果尚不存在)。在此可以存储任意配置,例如。 jackson.version = 2.10.0(请不要复制它,请始终在maven Central或类似设备上检查实际的新版本)。

  2. 使用通过project.properties映射定义的属性,该映射在指定依赖关系的双引号模板字符串内。例如:

dependencies {
    implementation "com.fasterxml.jackson.core:jackson-core:${project.properties['jackson.version']}"
    implementation "com.fasterxml.jackson.core:jackson-databind:${project.properties['jackson.version']}"
    //...
}

当然,可以使用其他语法:

dependencies {
    implementation(group: "com.fasterxml.jackson.core", name: "jackson-core", version: project.properties['jackson.version'])
    implementation group: "com.fasterxml.jackson.core", name: "jackson-databind", version: project.properties['jackson.version']
    //...
}