我有一个仅java的多项目sbt构建。我有一个项目,构建一个.war文件(与xsbt-web-plugin)。它依赖于其他构建.jar的项目,这些项目被捆绑到.war中。
在.jar项目中,我需要运行一个外部进程,在编译后生成.class文件,并将这些类捆绑到项目的.jar包中。
所以我可以有一个依赖于compile
的任务,并使用类路径和输出目录如下:
val ClassGen = TaskKey[Int]("generate-classes", "generates classes")
val ClassGenTask = ClassGen <<= doClassGen()
def doClassGen() =
(streams in Compile,
compile in Compile,
classDirectory in Compile,
fullClasspath in Compile) map {
...
"command here" !
}
这似乎导致任务依赖于编译。如果我有package
取决于我的任务,我认为这将在.jar文件构建之前运行:
sbt.Keys.`package` <<= (sbt.Keys.`package` in Compile) dependsOn ClassGen
但是…当我在依赖项目(.war项目)中执行package
任务时,它确实而不是似乎导致package
在依赖项中执行。我试着打开exportJars
,但无济于事。
我还见过生成了类但没有出现在.jar文件中的情况。这似乎是由于package
任务在我的ClassGen任务之前运行。
我对如何依赖于生成类的编译后的外部过程任务的输出感到困惑,并且与项目间的依赖关系正确地具有依赖顺序。我已经研究了exportedProducts
,这似乎可能是依赖项目会寻找的东西,但我对如何使其工作的想法。
可以将输出目录添加到products in Compile
。如果您检查package
依赖于什么,您将看到它依赖于compile:products
(最后一行):
> inspect tree compile:package
[info] compile:package = Task[java.io.File]
[info] +-compile:packageBin = Task[java.io.File]
[info] +-compile:packageBin::packageConfiguration = Task[sbt.Package$Configuration]
[info] | +-compile:packageBin::mappings = Task[scala.collection.Seq[scala.Tuple2[java.io.File, java.lang.String]]]
[info] | | +-compile:products = Task[scala.collection.Seq[java.io.File]]
似乎可以添加生成类以编译产品的文件夹。您可以通过添加
设置来实现这一点products in Compile += (target in Compile).value / "my_generated_classes"
如果您将类生成到target/my_generated_classes
目录。
p。我假定您生成的是二进制类,而不是必须编译的源代码。