繁体   English   中英

sbt 如何生成多个具有不同分类器和不同主类的 jar?

[英]How can sbt generate several jars with different classifiers and different main classes?

我正在使用 sbt 来打包我的项目。 但是,我的项目中有两个主要类基于相同的来源。 我想为这两个主要类创建两个具有不同分类器的 jar。 由于这两个主要类共享项目中的大部分源代码,因此我无法将它们分成两个项目。 因此,有人可以帮我修改 build.sbt 以实现这样的目标吗?

TL;DR:您需要做的就是在mainClass中定义sbt

现在让我们描述如何做到这一点。

在根,我们需要创建sbt.build 它的内容将是:

lazy val root = project.settings(
    version := "0.0.1-SNAPSHOT",
    scalaVersion := "2.12.12"
).aggregate(moduleA, moduleB)

lazy val commons = project
lazy val moduleA = project.settings(mainClass in (Compile, packageBin) := Some("MainClassA")).dependsOn(commons)
lazy val moduleB = project.settings(mainClass in (Compile, packageBin) := Some("MainClassB")).dependsOn(commons)

您可以阅读有关sbt 聚合以及如何指定要运行的主要方法/类的更多信息 该项目的结构如下:

/
|-build.sbt
|-project
    |-plugins.sbt
|-commons
    |-src
        |-main
            |scala
                |-SomeClass.scala
|-moduleA
    |-src
        |-main
            |-scala
                |-MainClassA.scala
|-moduleB
    |-src
        |-main
            |-scala
                |-MainClassB.scala

SomeClass.scala的内容是:

object SomeClass {
  def doPrint() = {
    println("I am in commons")
  }
}

MainClassA.scala的内容是(假设scala版本到2.12。在scala 2.13中你不需要扩展App annymore。):

object MainClassA extends App {

  override def main(args: Array[String]): Unit = {
      SomeClass.doPrint()
      println("Hello MainClassA")
  }
}

MainClassB.scala的内容是(这里的注释相同):

object MainClassB extends App {

  override def main(args: Array[String]): Unit = {
      SomeClass.doPrint()
      println("Hello MainClassB")
  }
}

plugins.sbt的内容将是:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")

现在,我们已经准备好了一切,我们需要执行。 我们安装了sbt-assembly插件,因此我们可以运行: sbt assembly.

这将创建一些文件,但我们会对 2 感兴趣:

./moduleA/target/scala-2.12/moduleA-assembly-0.1.0-SNAPSHOT.jar 
./moduleB/target/scala-2.12/moduleB-assembly-0.1.0-SNAPSHOT.jar

然后,当运行java -jar ./moduleA/target/scala-2.12/moduleA-assembly-0.1.0-SNAPSHOT.jar我们得到:

I am in commons
Hello MainClassA

并且,当运行java -jar ./moduleB/target/scala-2.12/moduleB-assembly-0.1.0-SNAPSHOT.jar我们得到:

I am in commons
Hello MainClassB

PS 真的不建议从同一个构建中创建多个 jar。 它会造成巨大的风险,即错过依赖项并获得缺少方法/类的运行时异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM