加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:27:27 所属栏目:安全 来源:网络整理
导读:我在SBT中有一个多项目构建配置,它由两个不相互依赖的不同模块组成.他们只是(碰巧)属于同一产品. 项目布局如下: myLib + build.sbt + myProject_1 | + build.sbt | + src | + ... + myProject_2 | + build.sbt | + src | + ... + project + Build.scala pro
我在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?

解决方法

我建议在build.sbt中使用以下(重新)包定义的解决方法:

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

其中a和b是(子)模块.

lazy val a = project

lazy val b = project

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

它还需要完全限定,因为包是由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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读