当前位置: 首页 > 知识库问答 >
问题:

如何参数化Spring Boot Gradle插件?

连鸿
2023-03-14

我们正在考虑从Maven迁移到Gradle,并且已经完成了替换父POM概念的大部分挑战。有一个棘手的问题我们还没有弄清楚。我们需要指定全局使用的Spring Boot版本,但我尝试过的两种解决方案都遇到了无效的构建文件问题:

  • 我尝试将plugins{id'org.springframework.boot'version'2.1.17.release'}声明放在公共构建脚本中。生成错误,“只有项目和设置生成脚本可以包含插件{}块。”
  • 我尝试调用公共构建文件来指定springbootversion参数,并在插件声明中使用该参数。生成错误,“plugins{}块之前只允许buildscript{}和其他plugins{}脚本块,不允许其他语句”

如果我可以简单地应用plugin:'org.springframework.boot',但是Gradle找不到这个插件,那么所有这些就会更容易。除了一个微服务外,所有的微服务都在Spring Boot的一个版本上,如果可能的话,我们希望能够在全球范围内升级。

附加信息

    null
repositories {
    mavenLocal()
    
    /* Removed our internal repositories */

    jcenter()
    mavenCentral()
}

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'maven-publish'
apply plugin: 'io.spring.dependency-management'

group = 'nedl-unified-platform'

/* Required to publish Spring Boot microservices to publish to repository */
configurations {
    [apiElements, runtimeElements].each {
        it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
        it.outgoing.artifact(bootJar)
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
    withJavadocJar()
    withSourcesJar()
}

ext {
    set('springBootVersion', '2.1.17.RELEASE')
    set('springCloudVersion', "Greenwich.SR6")
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/reports/jacoco")
}

test {
    finalizedBy jacocoTestReport // report is always generated after tests run
}

jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = 0.2
            }
        }
    }
}

jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
    
    reports {
        xml.enabled true
        html.destination file("${reportsDir}/jacocoHtml")
        xml.destination file("${reportsDir}/jacocoReport.xml")
    }
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
        }
    }

    repositories {
        /* excluded for privacy and brevity's sake, our internal Maven repo */
    }
}

plugins {
    id 'org.springframework.boot' version springBootVersion
}

apply from: "https://mycentral.repo/project-common/develop/build.gradle"

dependencies {
    implementation  'org.springframework.boot:spring-boot-starter-actuator'
    implementation  'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    implementation  'ch.qos.logback:logback-classic'
    implementation  'javax.annotation:javax.annotation-api:1.3.2'
    implementation  'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
    implementation  'org.glassfish.jaxb:jaxb-runtime:2.4.0-b180830.0438'
    testImplementation  'org.springframework.boot:spring-boot-starter-test'
}

version = '0.0.2-SNAPSHOT'

共有1个答案

竺国兴
2023-03-14

我认为这里的差距在于,在maven中,您有父POM的概念,而在Gradle中,您没有。没有1:1的映射,就像你说的,但你可以在Gradle中有插件,并应用一个插件。

最接近的方法是开发自己的Gradle插件,每个项目都可以应用。然后,您的自定义插件将配置Spring Boot和所有项目通用的其他配置。这个插件将定义您希望所有其他项目使用的Spring Boot版本。

如果定制插件只关心配置Spring Boot,那么它还需要做其他事情。当你没有足够的经验时,创建一个分级插件是很困难的。您将失去build.gradle的所有熟悉语法,您必须真正地编写代码(有一些相似之处,但我发现这很难),如果可能,我将避免它。

我不确定我是否理解您全局定义的Spring版本需求。除非你正在使用快照依赖项/插件(坏的,不要这样做),(或者一个黑魔法设置.gralde在你的repo之外),你将不得不把一些版本放在某个地方。作为另一种选择,您可以创建自己的自定义任务,该任务在check生命周期上运行,它将检查spring(或插件)的版本,如果它不是最新版本,则打印一个警告,并鼓励开发人员升级。

可以将属性添加gradle.properties中,作为springbootversion=2.1.17.release

 类似资料:
  • 问题内容: 我试图切换一些硬编码的查询以使用参数化输入,但是遇到一个问题:如何格式化参数化批量插入的输入? 当前,代码如下所示: 一个可能的解决方案(从如何将数组插入到一个带有PHP和PDO的单个MySQL Prepared语句中 修改而来)似乎是: 有没有更好的方法来完成带有参数化查询的批量插入? 问题答案: 好吧,您有三个选择。 一次构建-执行多次。基本上,您只需为一行准备一次插入,然后循环执

  • 问题内容: 考虑以下Pytest: 该测试使用Pytest固定装置,其本身具有属性。在测试中迭代该属性,以便仅在每个in的断言均成立的情况下测试才通过。 但是,我实际上想做的是生成3个测试,其中2个应该通过,其中1个将失败。我试过了 但这导致 据我了解,在Pytest固定装置中,函数“成为”其返回值,但是在对参数进行参数化时,这似乎尚未发生。如何以所需的方式设置测试? 问题答案: 从 pytest

  • 我有一些代码,我不希望包含在jar文件基于一个条件。 我的构建脚本看起来像 现在,当我运行脚本时,除了危险的java文件,所有文件的绝对路径都被打印出来,但它们仍然包含在jar中。 如果我删除启动插件并运行任务,危险的类文件仍然包含在jar中。 如果我在jar任务中添加一个子句,则不会打印危险文件,它们也不会包含在jar中。 如果我启用启动插件,并使用bootJar任务(它继承自Jar任务)(),

  • 我对Spring还不熟悉,对它能做些什么还只是初步了解。 在这种情况下,我需要使用注释设置一个循环任务。速率被指定为对象中的成员字段,该对象被传递给封装表示任务的方法的类。 我使用了允许访问配置或环境的机制,例如;这很有效。 我不知道如何做的是将对象中的值插入到中。 例如: 当然,上面的代码不起作用,我只是举一个例子来说明我要做的事情。 如有任何建议,将不胜感激。

  • 问题内容: 您如何访问“工作流程” Jenkins作业的“此构建已参数化”部分中的设置? 测试用例 创建一个工作流作业。 启用“此构建已参数化”。 添加具有默认值的STRING PARAMETER 。 将以下代码添加到: 运行工作。 结果 问题答案: 我认为使用Workflow插件时,变量可以直接使用,而不是通过env。尝试:

  • 问题内容: 我有一个数据类型: 另外,数据库字段类型是 现在我正在这样做: 如何才能做到这一点。 问题答案: 使用