如何将jar发布到本地存储库?

Posted

技术标签:

【中文标题】如何将jar发布到本地存储库?【英文标题】:How to publish jar to local repository? 【发布时间】:2011-12-09 13:42:00 【问题描述】:

我有一个编译成 jar(不是 sbt 项目,没有源代码,只是 jar 文件)的库,但在存储库中不可用。

有没有办法在本地发布 jar,以便我可以使用 libraryDependencies += "org.xxx" % "xxx" % "1.0" 表示法添加依赖项? (我已经知道如何通过将文件复制到lib 文件夹来将文件添加到项目中。)

【问题讨论】:

这是一个非常有趣的问题,因为我几乎没有看到不需要项目的任务(about 除外)。可以想到一个插件,您将在全球范围内注册并使用它将 jars 发布到本地 Ivy 存储库。我知道没有插件可以做到这一点。 【参考方案1】:

publishLocal 操作用于将您的项目发布到本地 Ivy 存储库。默认情况下,此本地存储库位于 $user.home/.ivy2/local。然后就可以在同一台机器上的其他项目中使用这个项目source

编辑:对不起,我误读了您的问题。这是一个example,用于将 jar 或源发布到您当地的常春藤仓库。

【讨论】:

对,但这不是一个项目,它是一个 jar 文件。我该怎么做? 在更新的 sbt 版本中,这是 publishLocal 而不是 publish-local: scala-sbt.org/release/docs/Publishing.html【参考方案2】:

tl;dr 我认为这是一种技巧,而不是 sbt 的功能。您已收到警告。

假设您要发布 file.jar。对于 任何 构建工具,包括 sbt,它执行的任务最终会从项目文件中创建一个工件 - 在大多数情况下是一个 jar 文件。

项目为工件设置坐标

诀窍是利用 sbt 为要发布的 jar 设置 环境(= 坐标)所需的东西(否则您必须指定它们在可能对用户友好也可能不太友好的命令行上)。

使用必要的设置创建一个build.sbt - organizationnameversion 和可能的scalaVersion - 并将其保存在 jar 文件所在的位置。

organization := "org.abc"

name := "my-own-publish-jar"

version := "1.0.0"

scalaVersion := "2.11.3"

packageBin in Compile := file(s"$name.value_$scalaBinaryVersion.value.jar")

您可能已经注意到,构建将compile:package 任务更改为指向 jar 文件。

就是这样。

执行sbt publishLocal,jar文件应该在Ivy2本地仓库,即~/.ivy2/local/org.abc/my-own-publish-jar_2.11/1.0.0/jars/my-own-publish-jar_2.11.jar

protip 现在编写一个插件来使用命令行中指定的坐标来做这件事应该很容易了。

【讨论】:

这对我有用。我确实必须放弃_$scalaBinaryVersion.value 才能实现我的特定目标,否则这就是解决方案。 是的,对于不需要 Scala 版本的 Java JAR,您可以设置 crossPaths := false 将其删除 - 但这应该只用于本地构建,当 Scala 二进制兼容性不是问题。 这种方式对我有用,但任何人都可以建议如何将它扩展到多个 jars?谢谢【参考方案3】:

假设您有 wetElephant.jarwetElephant-javadoc.jar 文件,您希望将它们发布到本地存储库并使用 libraryDependencies sbt taskKey 从另一个项目中引用它.

这是你需要做的。

    将您的库(wetElephant.jarwetElephant-javadoc.jar)放入 modules\wetElephant

    在您的 build.sbt 文件(或 Build.scala 文件)中定义项目

    lazy val stolenLib = project
      .in(file("modules/wetElephant"))
      .settings(
        organization              := "com.stolenLibs",
        name                      := "wetElephant",
        version                   := "0.1-IDonKnow",
        crossPaths                := false,  //don't add scala version to this artifacts in repo
        publishMavenStyle         := true,
        autoScalaLibrary          := false,  //don't attach scala libs as dependencies
        description               := "project for publishing dependency to maven repo, use 'sbt publishLocal' to install it",
        packageBin in Compile     := baseDirectory.value / s"$name.value.jar",
        packageDoc in Compile     := baseDirectory.value / s"$name.value-javadoc.jar"
      )
    

    从 sbt/activator 调用 publishLocal 任务(我是从 activator 调用的,并在它前面加上项目名称):

    ./activator wetElephant/publishLocal                   
    

...并阅读输出以查看发布的内容和位置:

    /cygdrive/d/devstation-workspace/projects/m4l-patches 1
      [info] Loading project definition from D:\devstation-workspace\projects\m4l-patches\project
      [info] Set current project to m4l-patches (in build file:/D:/devstation-workspace/projects/m4l-patches/)
      [info] Updating file:/D:/devstation-workspace/projects/m4l-patches/wetElephant...
    [info] Packaging D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow-sources.jar ...
    [info] Done packaging.
    [info] Wrote D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow.pom
      [info] Resolving org.fusesource.jansi#jansi;1.4 ...4 ....
    [info] Done updating.
    [info] :: delivering :: com.stolenLibs#wetelephant;0.1-IDonKnow :: 0.1-IDonKnow :: release :: Sun Dec 20 20:09:24 CET 2015
      [info]  delivering ivy file to D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\ivy-0.1-IDonKnow.xml
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\poms\wetelephant.pom
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\jars\wetelephant.jar
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\srcs\wetelephant-sources.jar
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\docs\wetelephant-javadoc.jar
      [info]  published ivy to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\ivys\ivy.xml
      [success] Total time: 1 s, completed 2015-12-20 20:09:24

    可选择在另一个项目中使用这些库

    libraryDependencies += "com.stolenLibs" % "wetElephant" % "0.1-IDontKnow"
    

免责声明:我不知道如何不发布资源......

【讨论】:

这不起作用。 scala 版本始终为 2.10,版本始终为 0.1.snapshot。【参考方案4】:

这是几个月前我将 sbt 工件推送到 maven 存储库(本地和远程)的一篇博文。

http://brizzled.clapper.org/id/100/

【讨论】:

谢谢,但我已经知道如何将 sbt 项目发布到我的本地存储库。我要问的是如何将一个现有的 jar 文件添加到我的本地存储库中。你知道怎么做吗?【参考方案5】:

试试这个:

http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

【讨论】:

-1,maven与这个问题无关,虽然不是你的错OP在这个问题上添加了“maven”标签。 哈哈虽然不是你的错,所以-1。他有一个他需要的jar文件在一个repository里,maven就是一个repository。 @cbmanica Roy 在这里是正确的。我赞成取消你被误导的反对票。【参考方案6】:

我在这里创建了一个示例 Play Framework/sbt 项目,它创建了一个本地存储库(不仅仅是publish-local):https://github.com/muymoo/local-ivy-repo-sbt 具体看Build.scala

makeLocalRepoSettings(publishedProjects):_*

localRepoArtifacts += "org.apache.ws.security" % "wss4j" % "1.6.9"

这些 localRepoArtifacts 可以在我的本地 ivy 存储库中找到,但我认为您可以编辑它以使用普通的旧 jar 文件。

运行:play local-repository-created

这是https://github.com/sbt/sbt-remote-control 的更简单版本,在Build.scala 中做了更多的事情。

【讨论】:

以上是关于如何将jar发布到本地存储库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的本地 m2 存储库中安装 POM?

Gradle - 将第三方依赖项安装到本地常春藤存储库中

阻止 Jenkins 将工件安装到本地 Maven 存储库

如何配置 Bamboo,使其自动从 SVN 中的本地存储库中提取依赖的 jar?

如何让 Grails 从 Maven 存储库中获取最新的本地 jars?

如何将本地 svn 存储库迁移到谷歌代码的 svn 存储库?