【问题标题】:How to get value from gradle.properties in .class file at the time of build如何在构建时从 .class 文件中的 gradle.properties 获取值
【发布时间】:2023-03-29 07:29:01
【问题描述】:

我想从 Java 类的 Gradle.properties 中获取一个属性值。 在 Java 中,应该在构建时替换该值,并且在 .jar(.class) 文件中会出现该值,但不会出现在 .java 文件中。这样我们就可以直接在 gradle.properties 中更改值,无需更改代码。 有没有可能实现?

【问题讨论】:

    标签: java gradle build.gradle .class-file gradle.properties


    【解决方案1】:

    如果您告诉您的具体用例,会更容易回答。 了解您的应用程序也会有所帮助,例如它是 Spring(Boot)应用程序吗?在这种情况下,使用 Spring Profiles 可能更有意义。

    无论如何,这是一个可能的解决方案:

    • 创建一个属性文件并将其放在您的资源文件夹中。定义一个占位符,该 gradle 可以替换。例如文件“myapp.properties”

      greetingText=@greeting@
      
    • 将标记('@'s 之间的文本)添加到您的 gradle.properties:

      greeting=Hello world!
      
    • 通过配置 processResources 任务使 build.gradle 用 gradle.properties 中的值替换令牌:

      processResources {
          inputs.file file('gradle.properties')
          filter(
                  ReplaceTokens, 
                  tokens: [
                          greeting: project.ext.greeting
                  ]
          )
      

      }

    • 在运行时从属性文件中加载值:

      public String getGreeting() throws IOException {
          try (
              InputStream inputStream = Thread.currentThread().getContextClassLoader().getResource("myapp.properties").openStream();
          ) {
              Properties appProps = new Properties();
              appProps.load(inputStream);
              return appProps.getProperty("greetingText");
          }
      }
      

    【讨论】:

    • 感谢您的回答。但是有没有办法直接从 gradle.properties 更新值到 java 类呢?
    • 嗯,您可以对 Java 源代码进行预处理,或者在编译后使用 ByteBuddy、cglib 或 javassist 之类的工具来操作字节码,以操作编译后的字节码类,但这似乎是一个很大的黑客攻击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多