我有一个只有java的多项目sbt构建。我有一个构建.war文件的项目(xsbt-web-plugin)。它取决于构建.jars的其他项目,这些项目被捆绑到.war。
在.jar项目中,我需要运行一个在编译后生成.class文件的外部进程,并将这些类捆绑到为项目打包的.jars中。
所以我可以拥有一个依赖于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文件中的情况。这似乎是由于在我的ClassGen任务之前运行package
任务。
我很困惑如何依赖于后编译的输出,生成类的外部进程任务,并且具有项目间依赖性的正确依赖序列。我根据here调查了exportedProducts
,这似乎可能是依赖项目所需要的东西,但是我没有考虑如何让它发挥作用。
答案 0 :(得分:0)
您可以将输出目录添加到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
目录的类。
PS。我假设您生成了二进制类,而不是必须编译的源。