如何在jar资源中扩展属性引用?

Emi*_*erg 8 gradle

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

<property name="databasePlatform" value="${sqlDialect}" />
Run Code Online (Sandbox Code Playgroud)

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

我试过这个:

jar {
    expand project.properties
}
Run Code Online (Sandbox Code Playgroud)

但它GroovyRuntimeException似乎失败了,就像Jar任务试图扩展.class文件中的属性一样.所以我试过了

jar {
    from(sourceSets.main.resources) {
        expand project.properties
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Emi*_*erg 10

我在一篇关于一个不同但密切相关的问题的帖子中偶然发现了这篇文章.原来你要配置processResources任务,而不是jar任务:

processResources {
    expand project.properties
}
Run Code Online (Sandbox Code Playgroud)

但是出于某种原因,clean在Gradle注意到这一变化之前,我确实需要做一次.


Nic*_*aly 9

除了@ emil-lundberg的优秀解决方案之外,我还将资源处理限制在所需的目标文件中:

的build.gradle

processResources {
    filesMatching("**/applicationContext.xml") {
        expand(project: project)
    }
}
Run Code Online (Sandbox Code Playgroud)

另外注意:如果${...}括号导致"无法解决占位符"错误,您也可以使用<%=...%>.NB使用*.properties文件进行测试,不确定这对XML文件有何影响.

  • 不适合我.我做了很多:`processResources {filesMatching("**/application.properties"){expand(project.properties)}`} (2认同)