【问题标题】:Gradle: Make a 3rd party jar available to local gradle repositoryGradle:使 3rd 方 jar 可用于本地 gradle 存储库
【发布时间】:2011-02-04 02:15:44
【问题描述】:

目前,我正在测试 Gradle 作为 Maven 的替代品。在我的项目中,有一些 3rd 方 jars,它们在任何(Maven)存储库中都不可用。我现在的问题是,我该如何管理它以将这些 jar 安装到我的本地 .gradle 存储库中。 (如果可能的话,我不想使用本地 Maven 存储库,因为 Gradle 应该独立运行。)目前,由于缺少 jars,我得到了很多异常。在 Maven 中,运行 install 命令非常简单。但是,我在 Google 上搜索类似于 Maven 安装命令的内容并不成功。有人有想法吗?

【问题讨论】:

    标签: maven-2 jar repository installation gradle


    【解决方案1】:

    简而言之:部署到存储库管理器。它可以在本地,在公司局域网上。

    考虑此类问题的一种完全不同的方式是使用存储库管理器,特别是如果它经常发生。有一些很棒的开源选项,例如 Artifactory、Nexus 或 Archiva。

    假设您有一个来源可疑的 jar 文件,需要将其包含在您的构建中,直到您有机会对其进行重构。存储库管理器将允许您将文件上传到您自己的存储库,例如,dubious-origin-UNKNOWN.jar

    然后你的 build.gradle 看起来像这样:

    repositories {
        mavenRepo urls: "http://your.own.repository/url";
    }
    
    dependencies {
        compile "dubious:origin:UNKNOWN";
    }
    

    使用存储库管理器还有很多其他优势,例如缓存远程工件、从 scm 中删除工件、暂存版本、更细化的用户权限等等。

    不利的一面是,您将添加一个服务器,这会带来一些维护开销以保持您的构建运行。

    我想这取决于你的项目的大小。

    【讨论】:

      【解决方案2】:

      Adam Murdoch 在http://gradle.1045684.n5.nabble.com/Gradle-Make-a-3rd-party-jar-available-to-local-gradle-repository-td1431953.html 的邮件列表中给出了更全面的答案

      截至 2010 年 4 月,没有简单的方法可以将新的 jarfile 添加到 ~/.gradle 存储库。目前正在研究这是否已经改变。

      截至 2014 年 10 月,情况仍然如此——因为 gradle 会对您的 jarfile 进行 md5 校验和,所以您不能简单地下载它并将其放入 .gradle/caches 下的目录中,而 gradle 不会,据我所知,有任何任务可以让您获取本地文件并将该文件推送到其缓存。

      【讨论】:

        【解决方案3】:

        使用 gradle-1.3 的 Adam Murdoch 帖子(上面已经链接:http://gradle.1045684.n5.nabble.com/Gradle-Make-a-3rd-party-jar-available-to-local-gradle-repository-td1431953.html)中的选项 (1),效果很好!

        这是他的评论:

        1. 将 jar 复制到本地目录并使用 flatDir() 存储库从那里使用它们。例如,您可以将它们复制到 $projectDir/lib 并在您的构建文件中执行:

        存储库{ flatDir(dirs: 'lib') }

        lib 目录中的文件必须遵循命名方案: name-version-classifier.extension,其中版本和分类器是 可选的。因此,例如,您可以称它们为 groovy-1.7.0.jar 甚至 groovy.jar

        然后,您只需将依赖项声明为正常:

        依赖{ 编译'groovy:groovy:1.7.0' }

        有一个更详细的 flatDir() 存储库位于: http://gradle.org/0.9-preview-1/docs/userguide/dependency_management.html#sec:flat_dir_resolver

        1. 与上述类似,但使用 ivy 解析器而不是 flatDir()。这与上述几乎相同,但允许 就命名和位置而言,还有更多选择。

        有一些细节在: http://gradle.org/0.9-preview-1/docs/userguide/dependency_management.html#sub:more_about_ivy_resolvers

        1. 不要费心声明依赖关系。只需将 jar 复制到某个地方的本地目录并添加文件依赖项即可。例如, 如果 jar 在 $projectDir/lib 中:

        依赖{ compile fileTree('lib') // 这包括编译类路径中 'lib' 下的所有文件 }

        更多详情请访问: http://gradle.org/0.9-preview-1/docs/userguide/dependency_management.html#N12EAD

        1. 使用 maven install 将依赖项安装到本地 maven 缓存中,并使用 maven 缓存作为存储库:

        存储库{ mavenRepo(urls: new File(System.properties['user.home'], '.m2/repository').toURI().toURL()) }

        【讨论】:

          【解决方案4】:

          您可以将文件系统 JAR 依赖项包含为:

          dependencies {
              runtime files('libs/a.jar', 'libs/b.jar')
              runtime fileTree(dir: 'libs', include: '*.jar')
          }
          

          您可以更改 compile/testCompile/etc 的运行时。

          【讨论】:

          • 如果第 3 方项目对另一个库有自己的依赖项怎么办?
          • fileTree 是否适用于 libs 文件夹中的所有子目录。 libs/sping/spring.jar 中的几个 jar 示例,在这种情况下,它是否也包括 spring .jar?
          【解决方案5】:

          我认为这样的事情应该可行:

          dependencies {
            files('yourfile.jar')
          }
          

          它对你有用吗?

          【讨论】:

          • 好的,对于这个幼稚的问题很抱歉,但是如果我放置文件('C:/Temp/myFile.jar')它会起作用还是我需要添加额外的环境变量?
          【解决方案6】:

          也许我在阅读你的问题时遗漏了一些东西,假设你的 gradle repo 是 flatDir 类型,你应该能够以 myjar-1.0.jar 的形式复制文件并将它们解析为 myjar 版本1.0。

          不确定为什么 Gradle 必须运行 maven 才能访问本地 maven 存储库。您可以只定义 Maven 存储库,它应该解决依赖关系。如果需要,您可以使用gradle upload 将 jar 推送到本地或远程 maven 存储库。在这种情况下,它将执行 maven。

          【讨论】:

            猜你喜欢
            • 2018-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-03
            • 2015-10-02
            • 1970-01-01
            • 2017-08-15
            • 2021-10-14
            相关资源
            最近更新 更多