如何正确地依赖外部生成的类



我有一个仅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。我假定您生成的是二进制类,而不是必须编译的源代码。

最新更新