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。请帮助,提前谢谢。这里有两个步骤
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
任务不会这样做。)