如何使 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?