【问题标题】:How to include an external jar file into the jar with package?如何将外部 jar 文件包含到带有包的 jar 中?
【发布时间】:2014-09-27 13:11:06
【问题描述】:

我的项目依赖于外部 jar。我创建了一个目录lib 并将jar 文件复制到其中。这是我的build.sbt

name := "approxstrmatch"

version := "1.0"

scalaVersion := "2.10.4"

unmanagedJars in Compile += file("lib/secondstring-20140729.jar")

libraryDependencies+="org.apache.spark"%%"spark-core"%"1.0.0"

resolvers += "AkkaRepository" at "http://repo.akka.io/releases/"

当我运行 cleanpackage 时,外部 jar 文件不会包含在生成的 jar 文件中。为什么?

这是项目布局:

project/build.sbt
lib/
src/.....

【问题讨论】:

    标签: sbt


    【解决方案1】:

    试试这个

    libraryDependencies += "com.acme.common" % "commonclass" % "1.0" from "file:///Users/bwong/git/perf-tools/commonclass/target/scala-2.11/commonclass_2.11-1.0.jar"
    

    我“sbt 打包”公共类项目,然后在依赖项目中的 build.sbt 中添加该库依赖项。

    感谢http://flummox-engineering.blogspot.com/2014/06/sbt-use-jar-file-for-librarydependencies.html 提供的这次黑客攻击。

    【讨论】:

    • 如何在Dependencies.scala中做到这一点,并将绝对路径替换为根目录lib文件夹路径?
    • 感谢您的回答!你知道我怎样才能只将指定的 JAR 文件添加到目标 JAR 文件(而不是所有依赖的 JAR 文件)?
    【解决方案2】:

    首先,除非您有更复杂的配置,否则无需显式指定unmanagedJars。只需将您的 JAR 文件放入 lib 目录,它们就会被添加到类路径 (docs)。

    要打包一个包含所有必要依赖项的可执行 JAR,请使用以下 SBT 插件之一:sbt-onejarsbt-assemblypackage 只是将您的类打包到一个 jar 中,而无需担心包含任何依赖项。

    插件文档中的说明应该很容易指导您如何使用它们。

    【讨论】:

    • 感谢您的回答!你知道我怎样才能只将指定的 JAR 文件添加到目标 JAR 文件(而不是所有依赖的 JAR 文件)?
    • @MaxU 如果您使用 sbt 程序集,您可以按照此处所述排除文件:github.com/sbt/sbt-assembly#assemblyexcludedjars。示例:assemblyExcludedJars in assembly := { val cp = (fullClasspath in assembly).value cp filter {_.data.getName == "compile-0.1.0.jar"} }
    • 非常感谢!我相信这个很好的例子应该是您宝贵答案的一部分;)
    【解决方案3】:

    诀窍是找出将 JAR 放入哪个 lib 目录。您可以通过在 sbt 控制台中运行以下命令来做到这一点:show unmanagedBase

    如果您在那里没有看到您的项目,您可以运行 show YOURPROJECT/unmanagedBase 以找到正确的 lib 路径。

    【讨论】:

      【解决方案4】:

      将此行添加到您的 build.sbt 并清理和编译您的项目。

      project/libs,这里的project是你项目的根目录,把你的jar包放在libs文件夹下。

      unmanagedBase := baseDirectory.value / "libs"
      

      【讨论】:

      • 最新命令unmanagedBase := baseDirectory.value / "libs"
      【解决方案5】:

      我一直在用解析器和设置键变量绞尽脑汁,但似乎这是最直接的方法 (https://www.scala-sbt.org/release/docs/Library-Dependencies.html):

      resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

      然后像往常一样添加到 libraryDependencies

      libraryDependencies += "<group>" % "<artifact>" % "<version>"

      【讨论】:

        【解决方案6】:

        tl;drproject/build.sbt 上移一级lib 目录并使用sbt-assembly 插件(如the other answer by Aleksey 中所述)。

        如果项目目录布局与您在项目中使用的一样,则这是不正确的,因为 build.sbtlib 不属于同一构建。

        由于sbt is recursive project/build.sbt 描述了管理主要项目的项目构建。引用the docs:

        项目目录是您项目中的另一个项目,它 知道如何构建您的项目。项目里面的项目可以(在 理论)做任何其他项目可以做的任何事情。您的构建定义是 一个 sbt 项目。

        乌龟一路向下。如果你喜欢,你可以调整 构建定义项目的构建定义,通过创建一个 项目/项目/目录。

        【讨论】:

          【解决方案7】:

          其中一个解决方案是,当您在 sbt 中构建该 jar 时,请执行 sbt publish-local

          【讨论】:

          猜你喜欢
          • 2015-03-02
          • 2011-09-18
          • 1970-01-01
          • 2013-06-08
          • 2021-12-28
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 2018-03-05
          相关资源
          最近更新 更多