gpt4 book ai didi

scala - 抑制 sbt-assembly 中的主类

转载 作者:行者123 更新时间:2023-12-04 02:48:25 24 4
gpt4 key购买 nike

在多项目 SBT 构建中,应该如何显式抑制 SBT-assembly 中的 mainClass 属性?

我进行了广泛的搜索,但似乎无法找到如何防止在多项目构建中由 sbt-assembly 构建的 jar 中设置主类。

在单个项目构建中,只要至少有两个类可能会被命令行调用,这似乎就可以工作:

import sbt._
import Keys._

import sbtassembly.Plugin._
import sbtassembly.AssemblyUtils._
import AssemblyKeys._

object TestBuild extends Build {
lazy val buildSettings = Defaults.defaultSettings ++ assemblySettings ++ Seq(
version := "0.1-SNAPSHOT",
organization := "com.organization",
scalaVersion := "2.10.2",
mergeStrategy in assembly := mergeFirst
)

lazy val root = Project(id = "test-assembly",
base = file("."),
settings = buildSettings) settings(
mainClass in assembly := None
)
lazy val mergeFirst: String => MergeStrategy = {
case "reference.conf" | "rootdoc.txt" => MergeStrategy.concat
case PathList("META-INF", xs @ _*) =>
(xs map {_.toLowerCase}) match {
case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) =>
MergeStrategy.discard
case ps @ (x :: xs) if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") =>
MergeStrategy.discard
case "plexus" :: xs =>
MergeStrategy.discard
case "services" :: xs =>
MergeStrategy.filterDistinctLines
case ("spring.schemas" :: Nil) | ("spring.handlers" :: Nil) =>
MergeStrategy.filterDistinctLines
case _ => MergeStrategy.first
}
case _ => MergeStrategy.first
}
}

但是,mainClass := None 似乎甚至不是必需的。事实上,即使留在那里,如果只有一个候选类, list 中仍然会设置一个主类。

不幸的是,在多项目构建中,即使通过包含一个附加类作为虚拟入口点,我也无法阻止设置主类。

经过大量尝试,我发现我可以通过在多个范围内将 mainClass 设置为 None 来防止设置主类。特别是,这可以解决问题:

mainClass in assembly := None
mainClass in packageBin := None
nainClass in Compile := None
mainClass in run := None

我找不到文档中说明的此要求,也无法弄清楚为什么这是必要的。在 (Compile, run) 中设置 mainClass := None 不起作用。它们确实需要单独确定范围。

这是手动抑制主类的正确方法还是我遗漏了什么?如果不是错误,我认为这应该记录在某处,特别是考虑到单项目构建和多项目构建之间的行为不一致。

最佳答案

Main-Class和 jar 中的所有其他属性最终由 packageOptions in assembly 确定, 所以你可以删除所有 Package.MainClass从它如下:

lazy val root = Project(id = "test-assembly",
base = file("."),
settings = buildSettings) settings(
packageOptions in assembly ~= { os => os filterNot {_.isInstanceOf[Package.MainClass]} }
)

这也适用于多项目构建。

注意:sbt-assembly 根据源输入的元数据缓存输出 jar,因此测试 assembly 附近的设置需要通过调用 clean 来清除缓存.

关于scala - 抑制 sbt-assembly 中的主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18325181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com