【问题标题】:How do I make sbt include non-Java sources to published artifact?如何使 sbt 将非 Java 源包含到已发布的工件中?
【发布时间】:2020-04-03 00:08:47
【问题描述】:

如何让 sbt 将非 Java 源代码包含到已发布的工件中?

我正在使用 Kotlin 插件,但不知道如何强制 sbt 将 .kt 文件包含到已发布的源 jar 中。它只包含 .java 文件。

网上很多人建议在 sbt 脚本中添加以下代码,但没有帮助

mappings in (Compile, packageSrc) ++= {
  val base  = (sourceManaged  in Compile).value
  val files = (managedSources in Compile).value
  files.map { f => (f, f.relativeTo(base).get.getPath) }
},

我也试过了

includeFilter in (Compile, packageSrc) := "*.scala" || "*.java" || "*.kt",

这是 sbt 控制台中一些变量的输出

sbt:collections> show unmanagedSourceDirectories
[info] * /home/expert/work/sideprojects/unoexperto/extensions-collections/src/main/scala
[info] * /home/expert/work/sideprojects/unoexperto/extensions-collections/src/main/java
[info] * /home/expert/work/sideprojects/unoexperto/extensions-collections/src/main/kotlin

sbt:collections> show unmanagedSources
[info] * /home/expert/work/sideprojects/unoexperto/extensions-collections/src/main/java/com/walkmind/extensions/collections/TestSomething.java

【问题讨论】:

  • 我也想不通 - 似乎是 SBT 中的一个错误,它只过滤 *.scala 和 *.java 文件(可能在 Kotlin 炒作之前完成;)。例如,src/main/kotlin 中的 *.scala 文件有效

标签: scala sbt


【解决方案1】:

你在 kotlin 中使用了哪个插件?

https://github.com/pfn/kotlin-plugin 具有选项kotlinSource 来配置源目录的位置。

sbt packageBin 编译 kotlin 文件并将其包含在输出 jar 中。

build.sbt

// define kotlin source directory
kotlinSource in Compile := baseDirectory.value / "src/main/kotlin",

src/main/kotlin/org.test

package org.test

fun main(args: Array<String>) {
    println("Hello World!")
}

控制台

sbt compile
sbt packageBin

目标/scala-2.13

jar 包含 MainKt.class

文件夹 org/test 也包含 MainKt.class。

这能解决你的问题吗?

【讨论】:

    【解决方案2】:

    我在我的项目https://github.com/makiftutuncu/e 中找到了解决方法。我做了以下:https://github.com/makiftutuncu/e/blob/master/project/Settings.scala#L105

    基本上,我在 SBT 中添加了以下设置以正确生成源工件:

    // Include Kotlin files in sources
    packageConfiguration in Compile := {
      val old = (packageConfiguration in Compile in packageSrc).value
      val newSources = (sourceDirectories in Compile).value.flatMap(_ ** "*.kt" get)
    
      new Package.Configuration(
        old.sources ++ newSources.map(f => f -> f.getName),
        old.jar,
        old.options
      )
    }
    

    对于文档工件,我将 Gradle 构建添加到我的 Kotlin 模块中。我按照此处https://github.com/makiftutuncu/e/blob/master/e-kotlin/build.gradle.kts 所示进行设置。这样,我让 Gradle 构建生成 Dokka 文档。最后,在 SBT 中添加以下设置以在构建文档时运行 Gradle:

    // Delegate doc generation to Gradle and Dokka
    doc in Compile := {
      import sys.process._
      Process(Seq("./gradlew", "dokkaJavadoc"), baseDirectory.value).!
      target.value / "api"
    }
    

    我承认,仅仅为了获得 2 个工件就需要做很多工作,但这对我来说是成功的。 ?? 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多