现在我有如下的 scala 项目目录:
my-project
ᄂsrc/main/scala
ᄂ com.foo.bar
├ foo1
│ ᄂ (...classes)
ᄂ foo2
然后我想打包到 jar 文件只是 'com.foo.bar.foo1' 目录文件。 但是如果我使用
sbt package
,sbt 将所有目录都放在 src/main/scala 下。
如果我命令
sbt package
:
target
ᄂ some-name-package.jar
ᄂ com.foo.bar
├ foo1
│ ᄂ (...classes)
ᄂ foo2
我想知道如何包装如下:
target
ᄂ some-specific-package.jar
ᄂ com.foo.bar
├ foo1
ᄂ (...classes)
但是我无法更改 build.sbt 文件。
如何打包特定目录?
您可以指定
mappings
Compile / packageBin / mappings := {
val original = (Compile / packageBin / mappings).value
original.filter {
case (file, toPath) =>
toPath.startsWith("com/foo/bar/foo1")
}
}
https://www.scala-sbt.org/1.x/docs/Howto-Package.html#Modify+the+contents+of+the+package
或者,您可以将您的项目分成两个子项目。然后目录结构将是
my-project
ᄂsubproject1
ᄂsrc/main/scala
ᄂ com.foo.bar
ᄂ foo1
ᄂ (...classes)
ᄂsubproject2
ᄂsrc/main/scala
ᄂ com.foo.bar
ᄂ foo2
build.sbt
lazy val subproject1 = (project in file("subproject1"))
.dependsOn(...)
.settings(
name := "subproject1",
...
)
lazy val subproject2 = (project in file("subproject2"))
.dependsOn(...)
.settings(
name := "subproject2",
...
)
https://www.scala-sbt.org/1.x/docs/Multi-Project.html
然后执行
sbt subproject1/package
就足够了
如果不能修改build.sbt文件,可以使用sbt控制台暂时排除特定源打包。以下是您的操作方法:
1 - 启动 sbt 控制台 2 - 在 sbt 控制台内,将源设置设置为仅包含您要打包的源。在您的情况下,仅包括 com.foo.bar.foo1 包:
set sources in Compile := (sources in Compile).value.filter(_.getPath.contains("com/foo/bar/foo1"))
2 - 运行包任务:
package
这将在目标目录中创建一个仅包含 com.foo.bar.foo1 包类的 JAR 文件。请注意,此更改只是暂时的,不会在不同的 sbt 控制台会话中持续存在。你原来的 build.sbt 保持不变。
如果需要再次打包整个项目,只需重启sbt控制台,照常运行打包任务即可。