0

我正在尝试使用 Gradle 的插件制作 BOM(物料清单 POM)java-platform,并希望将 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 ...

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

所以问题是我怎样才能使依赖解析为这些工作constraints

4

1 回答 1

0

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)
          }
        }
      }
    }
  }
}

于 2020-08-15T15:07:27.243 回答