Java 如何在带有Buildr的.war包中有条件地包含两个文件中的一个?
我们使用Buildr将应用程序打包为文件。为了进一步简化自动化部署过程,我想有条件地选择这两个文件中的一个(从目录Java 如何在带有Buildr的.war包中有条件地包含两个文件中的一个?,java,war,buildr,Java,War,Buildr,我们使用Buildr将应用程序打包为文件。为了进一步简化自动化部署过程,我想有条件地选择这两个文件中的一个(从目录src/main/resources) 数据库hsql.properties 数据库postgres.properties …并将其包含在生成的.war中,名称为database.properties。(在战争中的同一个地方,即WEB-INF/classes/,来自src/main/resources的文件现在在这里结束。) 有什么简单的方法吗?任何方法都可以——例如,参数化“包
src/main/resources
)
数据库hsql.properties
数据库postgres.properties
database.properties
。(在战争中的同一个地方,即WEB-INF/classes/
,来自src/main/resources
的文件现在在这里结束。)
有什么简单的方法吗?任何方法都可以——例如,参数化“包”(不知何故)或定义两个不同的任务/目标(我不确定术语),如“包hsql”和“包pgsql”——只要有效且足够简单
构建文件的相关位
:
load 'dependencies'
require 'buildr/hibernate'
desc "..."
define "foo" do
project.version = VERSION_NUMBER
project.group = GROUP
manifest["Implementation-Vendor"] = COPYRIGHT
compile.with WICKET,GUAVA,GSON, ... [many more libs]
test.with MOCKITO
resources
test.compile.with SERVLET,_('src/main/webapp'),_('src/main/resources')
package(:war).with(:libs=> [WICKET,GUAVA,GSON, ... ])
end
额外问题:如何在这两种情况下分别执行任意shell命令(我会使用涉及>
或sed
)来更改另一个配置文件?(我还想从另一个文件向applicationContext.xml
中“注入”一些db设置;这比在VCS中保留该文件的两个副本(内容基本相同)更可取。)
对不起,如果这是太基本;我是Buildr的新手,对Ruby也不太了解。(是的,使用当前团队成员都不精通的工具不是最佳情况……)如果有什么需要澄清的,请指出 参数化buildr构建的常用方法是使用环境变量。例如,您可能会将构建设计为这样执行:
$ buildr package DATABASE=postgres
在构建文件中,您可能有:
ENV['DATABASE'] ||= 'hsql' # this line makes the default 'hsql'
define "foo" do
# the rest of the definition
resources.enhance do
cp _(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties"), _(:target, :resources, "database.properties")
end
end
这是最简单的解决办法;你可以考虑的一个缺点是它会复制两个代码>数据库-*.Frase文件,除了<代码>数据库。如果这是一个问题,那么可以以更复杂的代价来解决它
额外答案:您可以使用系统
执行任意shell命令。例如,以次级销售为代价,我可以实现上述功能:
resources.enhance do
system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end
如果您想将属性注入到配置文件中,您可能需要查看Buildr的机制。太好了,非常感谢!我使用“cp”方法使其工作。(现在我有点赶时间,但稍后奖金案例(applicationContext.xml)真的应该清理一下,也许可以使用您提到的过滤机制…)