有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从构建中获得价值。gradle-in-Spring批处理项目

我的gradle.properties文件中有一些数据:

appVersion=1.4.31
appGroup=com.business
appName=projectName

我希望能够在.java项目中访问它们。我试图访问变量,如下所示:

@Value("${appVersion}")
private int version; 

然而,当我试图从主类运行应用程序时,我得到以下错误:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

这表明它找不到正确的变量

试图解决这个问题

添加@propertySource注释

我试着把这个添加到主类中 @PropertySource(value = "file:build.gradle", ignoreResourceNotFound = true)这是不成功的

build.gradle

我从this的答案中尝试了以下内容:

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

也没有成功

This下面的答案

我按照回答中所说的做了(我必须添加一个application.properties文件),得到了以下错误消息:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Circular placeholder reference 'appVersion' in property definitions

我认为它可能会与使用相同的名称(appVersion=appVersion)混淆,所以我更改了应用程序。属性行到

version=${appVersion}

然后在我的.java文件中,我将行更改为:

@Value("${version}")
private String version;

并得到了错误:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

共 (1) 个答案

  1. # 1 楼答案

    这应该是有效的:

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

    但你好像忘了另一部分。这只是告诉Gradle处理application.properties文件并替换它找到的任何占位符。您还需要在application.properties中放置一个占位符:

    version=${appVersion}
    

    然后,您的值注释应该可以工作(但它应该是String而不是int

    @Value("${version}")
    private String version; 
    

    最后,由于您是通过IDEA启动的,您可能需要确保gradle:processResources在应用程序启动之前运行,以便Gradle有机会替换您在application.properties中放置的占位符。您应该能够利用运行配置中的“Before Launch Options”部分,让IDEA在构建任务之后运行processResourcesGradle任务。这将导致每次运行应用程序时都正确替换占位符


    还有,只是为了帮助理解。Gradle是应用程序的构建系统,它不是应用程序本身的一部分。一旦项目建成,与Gradle有关的一切都无关紧要。这就是为什么你不能只做@Value("${appVersion}")然后让它工作。应用程序/Spring对用于构建它的工具一无所知(它也不应该知道)。因此,如果您想要访问应用程序,您需要在构建时以某种方式将Gradle项目版本注入到应用程序中。实现这一点的方法有很多,但上面的资源处理方法是一种非常常见的方法