在SBT中的多项目构建下使用包生成根项目的工件

 mobiledu2502869603 发布于 2023-02-08 14:16

我在SBT中有一个多项目构建配置,它由两个相互依赖的不同模块组成.他们只是(碰巧)属于同一产品.

项目布局如下:

myLib
  + build.sbt
  + myProject_1
  |    + build.sbt
  |    + src
  |        + ...
  + myProject_2
  |    + build.sbt
  |    + src
  |        + ...
  + project
       + Build.scala

project/Build.scala包含常见设置,如下所示:

import sbt._
import Keys._

object ApplicationBuild extends Build {

  val appVersion = "1.0-SNAPSHOT"

  val defaultScalacOptions = Seq(
    "-unchecked", "-deprecation", "-feature", "-language:reflectiveCalls",
    "-language:implicitConversions", "-language:postfixOps",
    "-language:dynamics", "-language:higherKinds", "-language:existentials",
    "-language:experimental.macros", "-Xmax-classfile-name", "140")

  val defaultResolvers = Seq(
    "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
  )

  val defaultLibraryDependencies = Seq(
    "org.specs2" %% "specs2" % "1.14" % "test",
    "org.slf4j" % "slf4j-nop" % "1.7.5" % "test"
  )

  val defaultSettings = Defaults.defaultSettings ++ Seq(
    scalacOptions ++= defaultScalacOptions,
    resolvers ++= defaultResolvers,
    libraryDependencies ++= defaultLibraryDependencies
  )
}

根构建文件build.sbt只需要将所有内容放在一起[我也尝试删除它..但是子项目不再被编译]:

lazy val myProject_1 = project.in(file("myProject_1"))

lazy val myProject_2 = project.in(file("myProject_2"))

最后这里是myProject_1/build.sbt [我刚刚省略了myProject_2/build.sbt,因为它非常相似,并没有为主题提供任何附加值]:

name := "myProject_1"

version := ApplicationBuild.appVersion

ApplicationBuild.defaultSettings

libraryDependencies ++= Seq(
  "commons-codec" % "commons-codec" % "1.8"
)

项目编译成功...但是当我发出命令时sbt package,会在根目标目录中生成一个空jar:

j3d@gonzo:~/myLib/$ ll target/scala-2.10
drwxrwxr-x 2 j3d j3d 4096 Dez 23 17:13 ./
drwxrwxr-x 5 j3d j3d 4096 Dez 23 17:13 ../
-rw-rw-r-- 1 j3d j3d  273 Dez 23 17:13 brix_2.10-0.1-SNAPSHOT.jar

我错过了什么吗?如何防止SBT生成这个空无用的jar?

2 个回答
  • 我提出了一个解决办法有下列(重新)定义packagebuild.sbt:

    Keys.`package` := {
        (Keys.`package` in (a, Compile)).value
        (Keys.`package` in (b, Compile)).value
    }
    

    where a(b是)(子)模块.

    lazy val a = project
    
    lazy val b = project
    

    由于package是Scala中的关键字,因此需要引用才能解析.

    它还需要完全限定,因为默认情况下在构建文件中package导入Keys._sbt._导入.sbt.

    /Users/jacek/sandbox/so/multi-packageBin/build.sbt:5: error: reference to package is ambiguous;
    it is imported twice in the same scope by
    import Keys._
    and import sbt._
    `package` := {
    ^
    [error] Type error in expression
    

    另请注意,我使用的是SBT 0.13.2-SNAPSHOT(源自内置),因此请谨慎使用(但我怀疑它会对任何版本的SBT 0.13+产生影响).

    [multi-packagebin]> */*:sbtVersion
    [info] 0.13.2-SNAPSHOT
    [multi-packagebin]> projects
    [info] In file:/Users/jacek/sandbox/so/multi-packageBin/
    [info]     a
    [info]     b
    [info]   * multi-packagebin
    [multi-packagebin]> package
    [info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}a...
    [info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}b...
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Resolving org.scala-lang#scala-reflect;2.10.3 ...
    [info] Packaging /Users/jacek/sandbox/so/multi-packageBin/b/target/scala-2.10/b_2.10-0.1-SNAPSHOT.jar ...
    [info] Done packaging.
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Packaging /Users/jacek/sandbox/so/multi-packageBin/a/target/scala-2.10/a_2.10-0.1-SNAPSHOT.jar ...
    [info] Done packaging.
    [success] Total time: 1 s, completed Feb 23, 2014 10:12:41 AM
    

    2023-02-08 14:19 回答
  • 这非常难以实现.以下一组选项似乎可以实现目标.这些选项的子集倾向于通过某些执行路径而不是其他执行路径来抑制根jar,因此如果要查找最小覆盖,请确保'sbt package'和'sbt publishLocal'都不会创建jar.我花了很长时间才找到这一套,我不愿意进一步迭代.

          Keys.`package` :=  file(""),
    packageBin in Global :=  file(""),
       packagedArtifacts :=  Map(),
    

    sbt:自2008年以来,简单的事情变得不可能.

    2023-02-08 14:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有