【问题标题】:Is there an easy way to copy all jar dependencies to a certain directory in XSBT 0.11.2?有没有一种简单的方法可以将所有 jar 依赖项复制到 XSBT 0.11.2 中的某个目录?
【发布时间】:2015-12-21 07:32:33
【问题描述】:

当从旧版本的 SBT 切换到最新版本时,我们失去了快速获取所有 jar 依赖项并将它们复制到目录的能力。在 XSBT 0.11.2 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    将以下内容添加到您的 build.sbt 将所有依赖项复制到项目根目录中的 lib_managed 文件夹中。

    retrieveManaged := true
    

    这是你要求的吗?

    【讨论】:

    • 这是否也复制了某个模块所依赖的其他模块的 jar 包? (例如,如果我有一个包含三个模块的项目,并且第三个模块依赖于其他两个模块,那会给我一个 lib_managed 目录,其中包含该模块所依赖的所有库的整个传递闭包,包括另一个模块该项目中的两个模块和它们的依赖项?
    • @Wilfred 是的,lib_managed 将包含您项目所需的每个 jar。这意味着您的直接依赖关系和所有传递依赖关系。
    【解决方案2】:

    我们使用与此类似的自定义任务定义来复制 jar。我不知道这是否是推荐的方法——那里没有丑陋的collect。随时发布改进(或根据需要在线修改我的答案)。

    copyJarsFolder <<= (crossTarget in (Compile, packageBin)).apply(_ / "jars")
    
    copyJars <<= inputTask { (argTask: TaskKey[Seq[String]]) =>
      (copyJarsFolder, dependencyClasspath in Compile) map { (folder, cpEntries) =>
        ("mkdir -p " + folder).!
        //
        // find all dependencies
        val jars = cpEntries.collect {
          case attrFile if attrFile.metadata.keys.exists(_.label == "artifact") =>
            // probably an external jar
            attrFile.data
        }
        val copyCmd = jars.mkString("cp -p ", " ", " " + folder)
        copyCmd.!
        folder
      }
    }
    

    【讨论】:

      【解决方案3】:

      另请参阅:How to declare a project dependency in SBT 0.10?

      是的,你加了

      retrieveManaged := true
      

      你会在 lib_managed 文件夹中看到 jars

      【讨论】:

        【解决方案4】:

        使用 sbt 0.13.7IO.copy 和朋友。

        1. 在构建定义的某处定义一些设置:

          val copyOutpath             = settingKey[File]("Where to copy all libs and built artifact")
          val copyAllLibsAndArtifact  = taskKey[Unit]("Copy runtime dependencies and built artifact to 'copyOutpath'")
          
        2. 定义这些设置的行为:

          lazy val myProject = project
            .in(file("."))
            .settings(
              copyOutpath              := baseDirectory.value / "specialFolderForMyProgram",
              copyAllLibsAndArtifact   := {
                val allLibs:                List[File]          = dependencyClasspath.in(Runtime).value.map(_.data).filter(_.isFile).toList
                val buildArtifact:          File                = packageBin.in(Runtime).value
                val jars:                   List[File]          = buildArtifact :: allLibs
                val `mappings src->dest`:   List[(File, File)]  = jars.map(f => (f, maxDynamicJarDir.value / f.getName))
                val log                                         = streams.value.log
                log.info(s"Copying to ${copyOutpath.value}:")
                log.info(s"  ${`mappings src->dest`.map(_._1).mkString("\n")}")
                IO.copy(`mappings src->dest`)
              },
              libraryDependencies       ++= Seq(
                //...
              )
            )
          

        【讨论】:

        • 你不是说copyOutpath 而不是maxDynamicJarDir 吗?
        【解决方案5】:

        也许我对这个问题的回答对你有帮助:Is there a way to get all dependencies of the project via sbt plugin? 这是我所知道的最简单的方法(我使用的是 sbt 0.11.2)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 2012-04-04
          • 2016-07-30
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 2014-10-28
          相关资源
          最近更新 更多