如何使用Buildr有条件地在.war包中包含两个文件之一?

时间:2010-12-15 12:29:25

标签: java war buildr

我们使用Buildr将应用程序打包为.war文件。为了进一步简化自动部署过程,我想有条件地选择这两个文件中的一个(来自目录src/main/resources)...

  • database-hsql.properties
  • database-postgres.properties

...并将其包含在名为database.properties的结果.war中。 (在WAR内的同一位置,即WEB-INF/classes/,来自src/main/resources的文件现在结束。)

任何简单的方法吗?任何方法都可以 - 例如参数化“包”(以某种方式)或定义两个不同的任务/目标(我不确定术语),例如“package-hsql”& “package-pgsql” - 只要它有效且足够简单。

buildfile的相关位:

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;这比在VCS中保留该文件的两个副本并且内容大部分相同更好。)

对不起,如果这太基础了;我是Buildr的新手,并不真正了解Ruby。 (是的,使用当前没有团队成员精通的工具并不是最佳情况......)如果需要澄清,请指出来!

1 个答案:

答案 0 :(得分:2)

参数化构建器构建的常用方法是使用环境变量。因此,例如,您可能会将您的构建设计为如此执行:

$ 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

这是最简单的解决方案;您可能会认为缺点的一点是,除了您实际使用的database-*.properties文件之外,它还会复制两个database.properties文件。如果这是一个问题,它可以以更复杂的代价来解决。

奖励回答:您可以使用system执行任意shell命令。例如,以替代方式为代价,我可以将上述内容实现为:

resources.enhance do
  system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end

如果您想将属性注入配置文件,您可能需要查看Buildr的filter机制。

相关问题