Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring Boot中将父项目的gradle属性传递给logback.xml?_Java_Spring_Spring Boot_Gradle - Fatal编程技术网

Java 如何在Spring Boot中将父项目的gradle属性传递给logback.xml?

Java 如何在Spring Boot中将父项目的gradle属性传递给logback.xml?,java,spring,spring-boot,gradle,Java,Spring,Spring Boot,Gradle,我有这样的项目结构: - parent-project - build.gradle - gradle.properties - child-project - build.gradle - src - main - java - resources - application.properties - logback.xml 这是父build.gradle: allprojects

我有这样的项目结构:

- parent-project
  - build.gradle
  - gradle.properties
  - child-project
    - build.gradle
    - src
      - main
        - java
        - resources
          - application.properties
          - logback.xml
这是父build.gradle:

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
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
}
父项目的my gradle.properties包含以下内容:

version=0.1.0-SNAPSHOT
这是子项目build.gradle:

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
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
}
这是子项目application.properties:

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

# graylog properties
graylogHost=host.com
graylogPort=555
graylogSourceId=app_id_dev
我之所以发布prop.testserver.computer-name属性,是因为我尝试使用gradle resourceProcess,但遇到了与此属性相关的错误

这是我的logback.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>
到子项目build.gradle,我得到了以下错误:

Groovy模板扩展缺少属性(COMPUTERNAME)。定义 键[parent,classLoaderScope,配置,插件,对象, logger、rootDir、projectRegistry、path、testResultsDirName、, targetCompatibility、java、规范化、bootJar、ChildProject、jar、, 状态、processResources、serviceRegistryFactory、任务、ext、, projectDir、dependencyLocking、projectEvaluationBroadcaster、, 依赖项管理、项目路径、模块、继承范围、, nexusBuilderUsername、版本、脚本、依赖项、, processTestResources、webAppDir、扩展、modelRegistry、安装、, projectEvaluator、nexusBuilderUserPassword、projectConfigurator、, archivesBaseName、日志记录、配置操作、sourceCompatibility、, 状态、子项目、组件、displayName、bootWar、, nexusDeployerUsername、parentIdentifier、TestClass、, antBuilderFactory、out、standardOutputCapture、docsDir、, compileTestGroovy、defaultTasks、nexusRepo、buildScriptSource、, AutoTargetJVM已禁用、reportsDir、sonarqube、BaseClasseLoaderScope、, 服务、汇编、渐变、distsDirName、构建文件、深度、, mutationState、docsDirName、testResultsDir、buildDir、, scriptHandlerFactory,延迟项目配置,项目, conf2ScopeMappings、groovyRuntime、存储库、, nexusDeployerUserPassword、scriptPluginFactory、resourceLoader、, testReportDir、compileGroovy、mavenPomDir、组、工件、测试、, configurationTargetIdentifier、compileJava、check、webAppDirName、, 文件解析程序、名称、testReportDirName、构建脚本、springBoot、, processOperations、asDynamicObject、publicType、类、identityPath、, 说明、源集、构建路径、文件操作、pluginManager、, defaultArtifacts、类、modelSchemaStore、报告、约定、, 所有项目、ant、war、资源、clean、compileTestJava、布局、, build、listenerBuildOperationDecorator、libsDir、distsDir、, uploadArchives、rootProject、libsDirName、属性、提供程序]

我需要帮助以参数方式将应用程序版本从父gradle.properties传递到子项目logback.xml。请帮助,提前谢谢。

这里有两个步骤

  • 在构建时-正在处理application.properties
  • 在运行时,从application.properties初始化logback.xml
  • 您只需在应用程序中添加项目版本。属性
    my_version=${project.version}

    使用logback.xml中的my_版本

    另外${HOSTNAME}而不是${COMPUTERMNAME}。
    请参见

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

    Spring引导在应用程序中有一个属性文件。在Gradle中,您可以通过以下方式启用它:

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

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

    您还可以让Spring Boot打印启动信息消息中的版本。但在这里,您必须将其添加到MANIFEST.MF文件中,例如:

    bootJar {
      manifest {
        attributes(
          "Implementation-Title": project.name,
          "Implementation-Version": archiveVersion
        )
      }
    }
    
    (请注意,只有在运行实际的bootJar文件时才会打印该文件-在Gradle中运行
    bootRun
    任务不会这样做。)