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

如何将父项目的gradle属性传递给logback。SpringBoot中的xml?

华锦程
2023-03-14

我有这个项目结构:

- parent-project
  - build.gradle
  - gradle.properties
  - child-project
    - build.gradle
    - src
      - main
        - java
        - resources
          - application.properties
          - logback.xml

这是父构建。格拉德尔:

allprojects {
    apply plugin: 'java'
    apply plugin: 'groovy'
    apply plugin: 'maven'

    group = 'com.test'

    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11

    repositories {
        mavenLocal()
        maven {
            url nexusRepo
            credentials {
                username = nexusUsername
                password = nexusPassword
            }
        }
        mavenCentral()
        jcenter()
    }
    
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: nexusRepo) {
                    authentication(userName: nexusUsername, password: nexusPassword)
                }
            }
        }
    }
}

uploadArchives.enabled = false

我的格拉德尔。父项目的属性包括以下内容:

version=0.1.0-SNAPSHOT

这是儿童项目build.gradle:

plugins {
    id 'org.springframework.boot' version '2.3.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id 'groovy'
    id 'war'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

dependencies {
    //spring boot related dependencies
    ...
    implementation "com.xm.logback:jLogbackGelfAppender:1.1.0"
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30'
    implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
    implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
    implementation group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '6.3'
    ...
    //testing related dependencies
}

这是子项目应用程序。特性:

prop.testserver.computer-name=${COMPUTERNAME}
...

# graylog properties
graylogHost=host.com
graylogPort=555
graylogSourceId=app_id_dev

我张贴道具的原因。测试服务器。computer name属性是因为我尝试使用gradle resourceProcess,但得到了有关此属性的错误。

这是我的日志。xml:

<!DOCTYPE configuration>

<configuration>
  <contextName>${graylogSourceId}</contextName>
  <jmxConfigurator/>

  <springProperty scope="context" name="graylogHost" source="graylogHost"/>
  <springProperty scope="context" name="graylogPort" source="graylogPort"/>
  <springProperty scope="context" name="graylogSourceId" source="graylogSourceId"/>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
  </appender>

  <appender name="GELF" class="com.xm.logback.GelfAppender">
    <server>${graylogHost}</server>
    <port>${graylogPort}</port>
    <protocol>TCP</protocol>
    <includeSource>true</includeSource>
    <includeMDC>true</includeMDC>
    <additionalFields>
      application=${graylogSourceId}
    </additionalFields>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%m</pattern>
    </layout>
  </appender>

  <logger name="com.test" level="INFO">
    <appender-ref ref="GELF"/>
  </logger>

  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
  </root>

</configuration>

我需要在登录中添加application_version,但我无法通过这个过程尝试不同的东西。

首先,我尝试使用这个选项

  • application_version=${version},应用程序运行,但记录器打印的版本_未定义

然后我补充道:

processResources {
    filesMatching('application.properties') {
        expand(project.properties)
    }
}

到子项目build.gradle,我得到了这个错误:

Groovy模板扩展缺少属性(CompUTERNAME)。定义的键[父,类LoaderScope,配置,插件,对象,记录器,rootDir,项目注册表,路径,测试结果DirName,目标兼容性,java,规范化,bootJar,儿童项目,jar,状态,进程资源,服务注册工厂,任务,文本,项目Dir,依赖锁定,项目评估广播,依赖管理,项目路径,模块,继承范围,nexusBuilderUsername,版本,脚本,依赖关系,处理测试资源,webAppDir,扩展,模型注册表,安装,项目评估器,nexusBuilderUserPassword,项目配置器,存档基础名称,日志记录,配置操作,源兼容性,状态,子项目,组件,显示名称,引导战争,nexusDeployerUsername,父母标识符,测试类,antBuilderFactory,输出,标准输出捕获,docsDir,编译测试Groovy,默认任务,nexusRepo,构建脚本源,自动目标Jvm残疾人,报告Dir,sonarqube,基类LoaderScope,服务,汇编,gradle,distisDirName,构建文件,深度,突变状态,docsDirName,testResultsDir,构建文件,脚本HandlerFactory,deferredProjectConfiguration,项目,conf2ScopeMappings,groovyRuntime,存储库,nexusDeployerUserPassword,脚本PluginFactory,资源加载器,testReportDir,编译Groovy,mavenPomDir,组,工件,测试,配置目标标识符,编译Java,检查,webAppDirName,fileResolver,名称,testReportDirName,构建脚本,springBoot,过程操作,asDynamicObject,公共类型,类,标识路径,描述,源集,构建路径,文件操作,pluginManager,默认文物,类,模型模式存储,报告,约定,所有项目,蚂蚁,战争,资源,清洁,编译测试Java,布局,构建,listenerBuildoperationDecorator,libsDir,发行版,上传档案,根项目,libsDirName,属性,提供程序]

我需要从父gradle传递应用程序版本的帮助。属性到子项目logback。xml参数化。请帮忙,提前谢谢。

共有2个答案

詹高畅
2023-03-14

这里有两个步骤

  1. 在构建-正在处理application.properties
  2. 在运行时-logback.xml从application.properties初始化

您只需在应用程序中添加项目版本。属性
my_version=${project.version}

在logback.xml中使用my_version

另外${HOSTNAME}而不是${COMPUTERMNAME}。看见http://logback.qos.ch/manual/configuration.html

柯易安
2023-03-14

您当然可以在生成期间对属性文件执行搜索/替换。在您的情况下,它失败了,因为Gradle正在尝试扩展应用程序中的${COMPUTERNAME}引用。属性文件。您可以通过使用filter而不是expand,或者通过将COMPUTERNAME定义为带有值“${COMPUTERNAME}”的Gradle属性(基本上用自身替换该值)来解决此问题。但是,对于在您的logback配置中包括应用程序版本,有一个(IMHO)更优雅的解决方案。

SpringBoot的一个特性是将构建信息作为属性文件包含在应用程序中。在Gradle中,您可以通过以下方式启用它:

springBoot {
    buildInfo()
}

该文件将在运行时类路径的META-INF/build-info下可用。属性。然后,您可以将其作为属性源包含在Logback中:

<configuration>
  <property resource="META-INF/build-info.properties" />
</configuration>

现在可以像对Spring属性所做的那样引用文件中的属性。尝试使用${build.version}获取版本。

您还可以让Spring Boot打印启动信息消息中的版本。但这里你必须把它添加到清单中。MF文件,例如通过:

bootJar {
  manifest {
    attributes(
      "Implementation-Title": project.name,
      "Implementation-Version": archiveVersion
    )
  }
}

(请注意,只有当您运行实际的bootJar文件时,它才会被打印——在Gradle中运行bootRun任务不会这样做。)

 类似资料:
  • 我正在使用gradle tooling api,我遇到了下面的场景。有一个应用某个插件P的项目,它只在传递shouldApplyP属性时才创建任务T。 因此,如果您将运行,您将看不到任务T,但是如果您将运行,您将看到任务T。 在gradle tooling api中,一旦创建了,我就可以执行 但我看不到这个具体的任务。是否有方法将此属性传递给项目连接,以便在方法中显示该属性?

  • 是否有方法将命令行参数传递给Gradle中的buildSrc项目。buildSrc位于主项目中,如果我用-p传递命令行args,那么主项目将接收它们,但不接收buildSrc。我需要这样做的原因是,我试图将maven Repository的凭据传递给buildSrc,buildSrc反过来使用它来解决其子项目的依赖关系。

  • 问题内容: 我有一个属性指令,其限制如下: 我需要传递两个属性;一个数字和一个函数/回调,使用对象在指令中访问它们。 如果指令是元素指令,那么我可以限制为: 但是,出于某种原因,我不再赘述,我需要将该指令作为属性指令。 如何将多个属性传递到属性指令中? 问题答案: 该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素也是如此。 模板: 指示: 如果attribute的值将被硬编码,则

  • 我目前正在进行struts升级(从struts 1.x迁移到2.x) 我的项目有一个自定义标记处理程序类,用于格式化应用程序中的数字 TLD文件 FormatNumberTag类 JSP 这里,AccountBean是bean,floatingRate是属性 1)在标签处理程序类上面,(org.apache.struts.util.请求Utils)请求Utils.lookup 相应的方法是什么 2

  • 我试图在mapbox gl地图上设置一个标记,点击地图,然后将lngLat对象传递回父组件。请告诉我怎样才能做到这一点。我刚开始学习反应,但我知道道具只能从父类继承,setState只能设置本地状态。 父组件如下所示 我正在学习这个教程https://github.com/laneysmith/react-mapbox-example

  • 问题内容: 我想知道如何将JSF托管的bean属性传递给JavaScript函数。 像这样: 问题答案: 这不是JSF变量的“传递”。这只是打印JSF变量,就好像它们是JavaScript变量/值一样。您知道,JSF和JS根本不同步运行。JSF在Web服务器中运行,并生成HTML/ CSS / JS代码,一旦到达该代码,该代码又在Webbrowser中运行。 您的具体问题很可能是由于您以这种方式生