如何在SBT中的项目之间共享资源

时间:2012-09-27 16:36:29

标签: scala sbt xsbt-web-plugin

我正在开展工作的项目是Lift框架上的webapp。我们也在使用xsbt web plugin。有一个“核心”项目,其中包含绝大多数功能;我目前的目标是创建两个“分发”项目,为“核心”项目添加一组不同的类路径资源。问题是,我要么1)无法运行“分发”项目,要么2)让它们运行,但所需资源似乎不存在。

我尝试了什么

这是我的project/Build.scala的简略版本:

lazy val core = Project("Core", file("core"))
  .settings( /*some dependencies, resolvers, webSettings */ )

lazy val app1 = Project("App1", file("app1"))
  .aggregate(core)
  .settings( /*the same settings as core */ )

lazy val app2 = Project("App2", file("app2"))
  .aggregate(core)
  .settings( /*the same settings as core*/ )

然后在app1app2的目录结构中,我有src/main/resources/aFileINeed的文件。核心应用程序使用class.getResource方法从类路径加载文件。

问题

如果我尝试使用container:start运行其中一个分发项目,则它不会在类路径中检测到所需的文件。此外,它声称src/main/webapp不是现有目录(该文件夹包含在核心项目中,因为它是xsbt web插件所要求的。)

如何让这些项目“合并”他们的资源?我希望在aggregate项目定义中使用dependsOnBuild.scala可以处理对我来说,但显然没有。

1 个答案:

答案 0 :(得分:4)

这就是我正在做的事情。我在项目的根目录中创建了一个全局“资源”目录,然后是以下变量:

    lazy val globalResources = file("resources")

然后在每个项目的设置中:

    unmanagedResourceDirectories in Runtime += globalResources 

对于使用xsbt-web-plugin或其他导入它的库的项目,你必须使用更强大的

    unmanagedResourceDirectories in Compile += globalResources

请注意,使用此解决方案,如果您定义同一文件两次compile:copy-resources,您的项目可能会有多个资源目录和AFAIK,您会对此生气。