2014-05-20 34 views
0

我有一个java-only的多项目sbt构建。我有一个建立.war文件的项目(与xsbt-web-plugin)。这取决于其他构建.jars的项目,这些项目将捆绑到.war中。如何在sbt中正确依赖外部生成的类?

在.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文件建造之前:当我在依赖项目(该项目的.war)执行package任务

sbt.Keys.`package` <<= (sbt.Keys.`package` in Compile) dependsOn ClassGen 

但是... ,它的确如此而不是似乎导致package在依赖项中执行。我试图打开exportJars无济于事。

我也看到了我的类生成但没有出现在.jar文件中的情况。这似乎是由于package任务在我的ClassGen任务之前运行。

我对如何依赖后编译的输出,生成类的外部流程任务以及具有项间依赖性的正确依赖关系序列感到困惑。我已根据here调查了exportedProducts,这似乎很可能是依赖项目寻找的东西,但对于如何使其发挥作用没有想法。

回答

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