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

Posted

技术标签:

【中文标题】如何使 sbt 将非 Java 源包含到已发布的工件中?【英文标题】:How do I make sbt include non-Java sources to published artifact? 【发布时间】: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 文件有效 【参考方案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 个工件就需要做很多工作,但这对我来说是成功的。 ?? 希望这会有所帮助。

【讨论】:

以上是关于如何使 sbt 将非 Java 源包含到已发布的工件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何组装 SBT Scala 库以包含在 Java 7 Maven 项目中?

如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

如何使 SBT 任务依赖于同一个 SBT 项目中定义的模块?

如何在 sbt 中运行 java/scala 单元测试

如何在sbt中启用多个监视源?

SBT 导入空的基于 JavaFX 的 jar