繁体   English   中英

Gradle `java-platform` 插件:如何设置依赖项动态版本分辨率?

[英]Gradle `java-platform` plugin: How to set dependencies dynamic version resolution?

我正在尝试使用 Gradle 的java-platform插件制作 BOM(材料清单 POM),并希望将 Gradle 的锁定功能与该插件一起使用:我想让版本始终保持最新。

这是我的build.gradle文件的一部分。

plugins {
   id "java-platform"
   id "maven-publish"
}

javaPlatform {
  allowDependencies()
}

dependencyLocking {
  lockAllConfigurations()
  lockMode = LockMode.STRICT
}

... skipped ...

dependencies {
  constraints {
    api("com.graphql-java:graphql-java:${library_graphql_version}")
    api("com.graphql-java:java-dataloader:${library_graphqlDataloader_version}")
    
    // Redisson
    api("org.redisson:redisson-hibernate-53:${library_redisson_version}")
    api("org.redisson:redisson-spring-boot-starter:${library_redisson_version}")
    api("org.redisson:redisson-spring-data-23:${library_redisson_version}")
  }
}

publications {
  some(MavenPublication) {
    from components.javaPlatform
    afterEvaluate {
      pom {
        name = 'BOM'
        description = 'Bill of Materials (BOM)'
      }
    }
  }
}

... skipped ...

gradle.properties文件

library_graphql_version=14.+
library_graphqlDataloader_version=2.+
library_redisson_version=3.+

当我执行generatePomFileForSomePublication任务时,它被转换为以下 POM 片段:

... skipped ...

<dependencyManagement>
   <dependencies>
      <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java</artifactId>
        <version>14.+</version>
      </dependency>
      <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>java-dataloader</artifactId>
        <version>2.+</version>
      </dependency>
      <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-hibernate-53</artifactId>
        <version>3.+</version>
      </dependency>
      <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-spring-boot-starter</artifactId>
        <version>3.+</version>
      </dependency>
      <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-spring-data-23</artifactId>
        <version>3.+</version>
      </dependency>
   </dependencies>
</dependencyManagement>

... skipped ...

显然,在生成的 POM 中不应该出现plus号。 这意味着,依赖解析不适用于java-platform约束。

所以问题是我怎样才能使依赖解析对这些constraints起作用?

找到了一个不使用java-platform插件的解决方法。

apply plugin: 'java'
apply plugin: 'maven-publish'

repositories {
  mavenCentral()
  jcenter()
  google()
  gradlePluginPortal()
}

dependencyLocking {
  lockAllConfigurations()
  lockMode = LockMode.STRICT
}

configurations {
  all {
    resolutionStrategy.activateDependencyLocking()
    resolutionStrategy.cacheChangingModulesFor 0, "minutes"
  }
}

dependencies {
  compile("com.graphql-java:graphql-java:${library_graphql_version}")
  compile("com.graphql-java:java-dataloader:${library_graphqlDataloader_version}")
  
  compile("org.redisson:redisson-hibernate-53:${library_redisson_version}")
  compile("org.redisson:redisson-spring-boot-starter:${library_redisson_version}")
  compile("org.redisson:redisson-spring-data-23:${library_redisson_version}")
}

jar {
  enabled = false
}

publishing {
  publications {
    some(MavenPublication) {
      afterEvaluate {
        pom {
          name = 'BOM'
          description = 'Bill of Materials (BOM)'
          packaging = 'pom'
          
          withXml {
            Node pomNode = asNode() as Node
            pomNode.dependencyManagement.dependencies.each { dependencies ->
              pomNode.dependencies.dependency.each { node ->
                dependencies.append(node)
              }
            }
            pomNode.properties.each { properties ->
              pomNode.dependencyManagement.dependencies.dependency.each { dependency ->
                def groupId = dependency.groupId[0].value().first()
                def artifactId = dependency.artifactId[0].value().first()
                def version = dependency.version[0].value().first()
                
                def propertyName = "${groupId}.${artifactId}.version"
                properties.append(new Node(null, propertyName, null, version))
  
                dependency.version[0].setValue("\${${propertyName}}")
              }
            }
            pomNode.remove(pomNode.dependencies)
          }
        }
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM