【问题标题】:How to expand property references in jar resources?如何扩展jar资源中的属性引用?
【发布时间】:2013-06-24 11:14:03
【问题描述】:

我正在使用 Gradle 构建一个包含 META-INF 中的 xml 文件的 jar。这个文件有一行像

<property name="databasePlatform" value="${sqlDialect}" />

允许为不同的环境使用不同的 SQL 数据库。我想告诉 gradle 从项目属性中扩展 ${sqlDialect}

我试过了:

jar {
    expand project.properties
}

但它失败了 GroovyRuntimeException 在我看来就像 Jar 任务试图扩展 .class 文件中的属性一样。所以我尝试了

jar {
    from(sourceSets.main.resources) {
        expand project.properties
    }
}

它不会抛出上述异常,而是导致所有资源被复制两次——一次有属性扩展,一次没有。我设法解决了这个问题

jar {
    eachFile {
        if(it.relativePath.segments[0] in ['META-INF']) {
            expand project.properties
        }
    }
}

这是我想要的,因为在我的用例中,我只需要扩展 META-INF 目录中的文件属性。但这感觉就像一个非常丑陋的 hack,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    我在一个线程中偶然发现了this post,这是一个不同但密切相关的问题。原来你想配置processResources 任务,而不是jar 任务:

    processResources {
        expand project.properties
    }
    

    不过,出于某种原因,我确实必须在 Gradle 注意到更改之前clean 一次。

    【讨论】:

      【解决方案2】:

      除了 @emil-lundberg 的出色解决方案之外,我会将资源处理限制为仅需要的目标文件:

      build.gradle

      processResources {
          filesMatching("**/applicationContext.xml") {
              expand(project: project)
          }
      }
      

      附加说明:如果${...} 括号导致“无法解析占位符” 错误,您也可以使用&lt;%=...%&gt;注意使用*.properties 文件进行了测试,不确定这对 XML 文件有何作用。

      【讨论】:

      • 对我不起作用。我做了不同的事情:processResources { filesMatching("**/application.properties") { expand(project.properties) } }
      • 是的(抱歉)。我刚刚从我的项目中复制了代码......我在变量前面加上了project.*,例如&lt;property name="databasePlatform" value="${project.sqlDialect}" /&gt;.
      【解决方案3】:

      我在从 maven 迁移到 gradle build 时遇到了类似的问题。到目前为止,最简单/最简单的解决方案是简单地自己进行过滤,例如:

      processResources {
        def buildProps = new Properties()
        buildProps.load(file('build.properties').newReader())
      
        filter { String line ->
          line.findAll(/\$\{([a-z,A-Z,0-9,\.]+)\}/).each {
              def key = it.replace("\${", "").replace("}", "")
              if (buildProps[key] != null)
              {
                  line = line.replace(it, buildProps[key])
              }
          }
          line
        }
      }
      

      这将从指定的属性文件加载所有属性并过滤所有“${some.property.here}”类型的占位符。完全支持 *.properties 文件中的点分隔属性。

      作为一个额外的好处,它不会像 expand() 那样与 $someVar 类型的占位符发生冲突。此外,如果占位符无法与属性匹配,则保持不变,从而减少来自不同来源的属性冲突的可能性。

      【讨论】:

        【解决方案4】:

        这是在多模块项目中对我有用的(Gradle 4.0.1):

        /webshared/build.gradle:

        import org.apache.tools.ant.filters.*
        
        afterEvaluate {
            configure(allProcessResourcesTasks()) {
                filter(ReplaceTokens,
                        tokens: [myAppVersion: MY_APP_VERSION])
            }
        }
        
        
        def allProcessResourcesTasks() {
            sourceSets*.processResourcesTaskName.collect {
                tasks[it]
            }
        }
        

        我的MY_APP_VERSION 变量在顶级build.gradle 文件中定义:

        ext {
        
            // application release version.
            // it is used in the ZIP file name and is shown in "About" dialog.
            MY_APP_VERSION = "1.0.0-SNAPSHOT"
        }
        

        我的资源文件在/webshared/src/main/resources/version.properties

        # Do NOT set application version here, set it in "build.gradle" file
        # This file is transformed/populated during the Gradle build.
        version=@myAppVersion@
        

        【讨论】:

          【解决方案5】:

          我接受了您的第一次尝试并创建了一个测试项目。我将来自 jenkins 插件的 pom 文件放在 ./src/main/resources/META-INF/ 中。我认为这是一个足够好的 xml 示例。我将 artifactId 行替换为如下所示:

          <artifactId>${artifactId}</artifactId>
          

          我的 build.gradle:

          apply plugin: 'java'
          
          jar {
              expand project.properties
          }
          

          当我第一次运行gradle jar 时,它爆炸了,因为我忘记为属性定义一个值。我的第二次尝试使用以下命令行成功:

           gradle jar -PartifactId=WhoCares
          

          出于测试目的,我刚刚使用 -P 定义了该属性。我不确定您如何尝试定义您的财产,但也许这是缺少的部分。如果没有看到您的异常的堆栈跟踪,很难确定,但上面的示例对我来说非常有效,并且似乎解决了您的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-05-28
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            • 2012-03-10
            • 1970-01-01
            • 2011-10-26
            相关资源
            最近更新 更多