如何在sbt中正确依赖外部生成的类?

时间:2014-05-20 20:43:09

标签: java scala sbt

我有一个只有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,这似乎可能是依赖项目所需要的东西,但是我没有考虑如何让它发挥作用。

1 个答案:

答案 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。我假设您生成了二进制类,而不是必须编译的源。