2017-08-21 37 views
2

我该如何累计一个项目的所有discoveredMainClasses及其相关子项目在SBT中?收集子项目'discoverMainClasses`

例如,我有一个项目看起来像

├── bar 
│   └── src 
│    └── main 
│     └── scala 
│      └── BarMain.scala 
├── build.sbt 
├── foo 
│   └── src 
│    └── main 
│     └── scala 
│      └── FooMain.scala 
├── project 
│   └── build.properties 
└── root 

有了一个root项目aggregate(foo, bar),我得到了discoveredMainClasses如下:

[info] foo/compile:discoveredMainClasses 
[info] List(MainFoo) 
[info] bar/compile:discoveredMainClasses 
[info] List(MainBar) 
[info] root/compile:discoveredMainClasses 
[info] List() 

有了一个root只有dependsOn(foo, bar)我得到

> show discoveredMainClasses 
[info] * 

如何让show root/discoveredMainClasses包含MainFooMainBar

对于情况下,我必须依赖于输出discoveredMainClasses即其他任务makeBashScriptsnative-packager

回答

1

的核心思想是创造取决于所有所有要包括和配置所有子模块的模块此模块上的设置。

这导致build.sbt这样

lazy val root = project.in(file(".")) 
    // package the root module, but not the sub modules 
    .enablePlugins(JavaAppPackaging) 
    .settings(
    name := "application", 
    // add the discoveredMainClasses to this project 
    discoveredMainClasses in Compile ++= (discoveredMainClasses in (client, Compile)).value, 
    discoveredMainClasses in Compile ++= (discoveredMainClasses in (server, Compile)).value 
) 
    // include these modules in the resulting package 
    .dependsOn(client, server) 

lazy val client = project.in(file("client")) 
    .settings(
    name := "client" 
) 

lazy val server = project.in(file("server")) 
    .settings(
    name := "server" 
) 

(discoveredMainClasses in (client, Compile)).value从编译范围的客户端项目访问discoveredMainClasses。

您可以构建和

$ sbt universal:stage 
$ ./target/universal/stage/bin/client-app 
$ ./target/universal/stage/bin/server-app 

一个running example can be found here运行应用程序。

欢呼声,缪奇

0

的另一种方式@缪奇的回答是定义一个ScopeFilter包含一切,但root和积累主要类别的方式。这具有不必重复client,server无处不在的优点。

所得build.sbt

lazy val allCompileButRootFilter = 
    ScopeFilter(inAggregates(ThisProject, includeRoot = false), inConfigurations(Compile)) 

lazy val root = project.in(file(".")) 
    .aggregate(client, server) 
    .enablePlugins(JavaAppPackaging) 
    .settings(
    discoveredMainClasses in Compile ++= 
     discoveredMainClasses.all(allCompileButRootFilter).value.flatten, 
    ... 
)