【问题标题】:how to depend on externally generated classes properly in sbt?如何在 sbt 中正确依赖外部生成的类?
【发布时间】:2014-07-09 06:59:54
【问题描述】:

我有一个仅限 java 的多项目 sbt 构建。我有一个构建 .war 文件的项目(带有xsbt-web-plugin)。这取决于构建捆绑到 .war 中的 .jar 的其他项目。

在 .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 任务之前运行。

我很困惑如何依赖编译后、生成类的外部流程任务的输出,以及如何正确地使用项目间依赖项来获得该依赖项序列。我已经按照here 研究了exportedProducts,这似乎是依赖项目会寻找的东西,但我不知道如何使它工作。

【问题讨论】:

    标签: java scala sbt


    【解决方案1】:

    您可以将输出目录添加到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 目录。

    附言。我假设您生成的是二进制类,而不是必须编译的源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多