【问题标题】:How to add local .jar file dependency to build.gradle file?如何将本地 .jar 文件依赖项添加到 build.gradle 文件?
【发布时间】:2014-01-09 02:31:18
【问题描述】:

所以我尝试将我的本地 .jar 文件依赖添加到我的 build.gradle 文件中:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
} 

您可以看到我将 .jar 文件添加到了这里的 referencedLibraries 文件夹中:https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

但问题是当我在命令行上运行命令时: gradle build 我得到以下错误:

error: package com.google.gson does not exist
import com.google.gson.Gson;

这是我的整个仓库:https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1

【问题讨论】:

  • 你确定运行时而不是编译?编译文件(....)
  • 如果无法构建jar,它看起来像是编译依赖。尝试:编译文件('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar') 如果仍然有问题,请尝试绝对路径,因为这也可能是问题。
  • 这个Stack Overflow question终于给了我我需要的答案。
  • 这能回答你的问题吗? Android Studio: Add jar as library?

标签: java gradle dependency-management build.gradle gradle-eclipse


【解决方案1】:

根据the documentation,对本地jar依赖使用相对路径,如下。

Groovy 语法:

dependencies {
    implementation files('libs/something_local.jar')
}

Kotlin 语法:

dependencies {
    implementation(files("libs/something_local.jar"))
}

【讨论】:

  • @Gubatron 现在记录在案:gradle.org/docs/current/userguide/…
  • 只是想为那些使用我们 jar 的相对路径的人添加:依赖项 { compile files("libs/something_local.jar" } (即双引号而不是单引号)需要Groovy 来评估路径。单引号在 Groovy 中按字面意思表示。
  • 所以我使用相同的东西,我得到编译错误(看起来它没有在那里找到 jar。)如果我给出绝对路径它工作正常。
  • 我更喜欢这个解决方案,但是我发现如果文件不存在,Gradle 不会输出错误。我亲自找到了这个,有关详细信息,请参阅此 SO 问题:stackoverflow.com/q/42527631/4851565
  • 即使在使用此解决方案后,我也遇到了类似的错误。错误我确实将 libs 文件夹放在与应用程序不同级别的应用程序下
【解决方案2】:

如果您确实需要从本地目录中获取该 .jar,

在您的模块 gradle 旁边添加(不是应用程序 gradle 文件):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

但是,作为实际 maven 存储库中的标准 .jar,您为什么不尝试一下呢?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}

【讨论】:

  • 我正是在寻找这个,但我发现我的本地存储库无法解析传递依赖项。(Gradle 2.7,示例 POM 是 com.mojang:authlib:1.5.21,由 minecraftforge.net 提取)
  • 如果多个目录下有本地jar文件,需要全部添加到flatDir。例如:- flatDir { dirs 'libs1','libs2','libs3'}
  • 我有一个gradle.build 文件 - 这些“应用程序 gradle 文件”和“模块 gradle”是什么?
  • 是否有人会通过描述这些功能的官方 Gradle 文档部分的链接来更新答案?
  • implementation(":gson:2.2.4") 似乎是这样做的方法。
【解决方案3】:

您也可以这样做,将所有 JAR 包含在本地存储库中。这样您就不必每次都指定它。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

【讨论】:

  • 这个用于编译lib目录下的所有jar。它是完美的解决方案(y)
  • ...除非您打算与具有不同依赖项集的不同模块共享该 libs 目录,例如不将服务器代码与客户端代码一起放入,或者在不同的依赖项中具有多个版本的依赖项子模块。
  • 这是我首选的实现而不是接受的答案,因为它明确说明了文件的位置。当您为某些库引用诸如 mavenCentral 之类的存储库并为其他库引用本地副本时,它很有用。在这种情况下,当 gradle 在其他存储库中搜索本地库时,可能会有延迟。
  • 请注意,dir 也可以是绝对路径。此外,我不得不使用“包含”而不是“包含”。
  • 对于 gradle 7+ 使用 implementation fileTree(dir: 'lib', includes: ['*.jar'])(或 api,取决于您的需要)
【解决方案4】:

以下对我有用:

compile fileTree(dir: 'libs', include: '*.jar')

请参阅Gradle Documentation

【讨论】:

  • 重要的是要记住,如果您不希望特定库与您的项目一起编译,则必须记住将其从 libs 文件夹中删除...我不喜欢这种方法,因为除非我进入图书馆,否则我看不到我添加了哪个图书馆
  • 这与@Nightwolf 的回答有何不同?
  • 在 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象上找不到参数 [directory 'libs'] 的方法 compile()
  • 如何访问特定模块的文件夹?我想向“app”模块添加一个依赖项,以访问另一个模块文件夹中的某个 aar 文件。含义:library/build/outputs/aar/library-release.aar
  • 新版本的Gradle不支持“编译”,我们需要使用“实现”来代替。所以像“实现fileTree(dir:'libs',include:['*.jar'])”
【解决方案5】:

您可以尝试为 Gradle 重用本地 Maven 存储库:

  • 将 jar 安装到本地 Maven 存储库中:

    mvn install:install-file -Dfile=utility.jar -DgroupId=com.company -DartifactId=utility -Dversion=0.0.1 -Dpackaging=jar

  • 检查您是否已将 jar 安装到您的 ~/.m2/ 本地 Maven 存储库中

  • 在您的 build.gradle 文件中启用您的本地 Maven 存储库:

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    
    • 现在您应该启用 jar 以在您的项目中实现

【讨论】:

  • 当一切都失败时,这个帮助了我!
  • 虽然这可行,但这是一种变通方法,不应在自动化生产/舞台环境中使用,因为这增加了在构建系统中具有 .m2 文件夹(maven 安装)的额外依赖关系。
  • 当我尝试这个时,我得到一个错误:无法解析 POM,已经看到 doctype。这是我尝试运行 gradle 命令的时候。
【解决方案6】:

使用 Kotlin DSL 的解决方案

到目前为止添加的解决方案非常适合 OP,但如果不先翻译它们,就不能与 Kotlin DSL 一起使用。下面是我如何使用 Kotlin DSL 在构建中添加本地 .JAR 的示例:

dependencies {
    compile(files("/path/to/file.jar"))
    testCompile(files("/path/to/file.jar"))
    testCompile("junit", "junit", "4.12")
}

请记住,如果您使用的是 Windows,则必须对反斜杠进行转义:

...
compile(files("C:\\path\\to\\file.jar"))
...

还要记住,引号必须是双引号,而不是单引号。


2020 年编辑:

Gradle 更新已弃用 compiletestCompile,取而代之的是 implementationtestImplementation。所以上面的依赖块对于当前的 Gradle 版本看起来像这样:

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}

【讨论】:

  • +1 为我工作!你知道如何在不必生成 jar 文件的情况下做同样的事情吗(以防我碰巧生成了 jar)?
  • @KareemJeiroudi 我可能误解了您的问题,但如果您正在谈论使模块成为项目的依赖项,您可以这样做:compile(project(":MyProject")),其中“MyProject”定义在您的 settings.gradle 文件,其中包含 include("MyProject") 之类的内容。
【解决方案7】:

接受的答案很好,但是,我需要在我的多项目 Gradle 构建中进行各种库配置才能使用相同的第 3 方 Java 库。

将 '$rootProject.projectDir' 添加到我的 'allprojects' 闭包中的 'dir' 路径元素意味着引用了每个子项目相同的“libs”目录,并且不是该子项目的本地版本:

//gradle.build snippet
allprojects {
    ...

    repositories {
        //All sub-projects will now refer to the same 'libs' directory
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

Quizzie 编辑:将“${rootProject.projectDir}”更改为“$rootProject.projectDir”(适用于最新的 Gradle 版本)。

【讨论】:

  • 但是如何在库 build.gradle 文件中引用这个 libs 文件夹?任何帮助。
  • 只需将“${rootProject.projectDir}”更改为“$rootProject.projectDir”即可再次使用。
  • 请务必使用双引号而不是单引号,因为后者不会被插值。
  • 这种方法对我有帮助。
  • 这里的所有答案对我帮助很大。这种模式是我们正在使用的一种模式,它使团队工作的人在处理分支时只需将 JAR 拖放到该目录中即可。
【解决方案8】:

短版:

dependencies {
    implementation fileTree('lib')
}

【讨论】:

    【解决方案9】:

    一个简单的方法是

    compile fileTree(include: ['*.jar'], dir: 'libs')
    

    它会编译 App 中 libs 目录下的所有 .jar 文件。

    【讨论】:

    • fileTree 是否适用于 libs 文件夹中的所有子目录。 libs/sping/spring.jar 中的几个 jar 示例,在这种情况下,它是否也包括 spring .jar?
    • 不,它没有。从技术上讲,它不应该那么好,因为我们提供的是 'dir:libs' 而不是 libs 的子目录。
    • 在这种情况下如何以最少的任务从子目录中获取所有库(因为我们的项目包含这么多子目录。
    • 嘿@mallikgm 抱歉回复晚了,您是否尝试在 dir 路径中添加通配符,例如 compile fileTree(include: ['.jar'], dir: 'libs')
    • 这与@Nightwolf 的回答有何不同?
    【解决方案10】:

    这个问题已经详细回答了。我还是想补充一些让我觉得很意外的东西:

    “gradle 依赖项”任务没有列出任何文件依赖项。尽管你可能这么认为,毕竟它们已经在“依赖项”块中指定了..

    所以不要依赖它的输出来检查你引用的本地 lib 文件是否正常工作。

    【讨论】:

    • 哇,我希望我能在 3 小时前阅读您的回答!谢谢。这是 Gradle 人员为我们开发人员提出的另一个真正问题。
    【解决方案11】:

    我无法通过https://stackoverflow.com/a/20956456/1019307 获得上述建议。不过,这对我有用。对于我存储在项目根目录的libs/ 目录中的文件secondstring-20030401.jar

    repositories {
        mavenCentral()
        // Not everything is available in a Maven/Gradle repository.  Use a local 'libs/' directory for these.
        flatDir {
           dirs 'libs'
       }
    }
    
    ...
    
    compile name: 'secondstring-20030401'
    

    【讨论】:

    • 谢谢!不知道为什么,但只有这对我有用。在我的项目根目录中创建了一个“libs”文件夹,将 .jar 推入其中,并复制了您的“编译名称”条目。当然也删除了 .jar 扩展名。
    • 不,这对我不起作用找不到:miglayout-core:。在以下位置搜索:file:/user/path/to/miglayout-core.jar
    • 如果你想添加一个文件目录作为存储库,这项工作:docs.gradle.org/current/userguide/…
    【解决方案12】:

    最好的方法是在你的 build.gradle 文件中添加它并点击同步选项

    dependency{
        compile files('path.jar')
    }
    

    【讨论】:

      【解决方案13】:

      对我有用的解决方案是在 build.gradle 文件中使用 fileTree。 将需要添加为依赖项的 .jar 保留在 libs 文件夹中。在 build.gradle 的依赖块中给出以下代码:

      dependencies {
          compile fileTree(dir: 'libs', include: ['*.jar'])
      }
      

      【讨论】:

        【解决方案14】:

        你可以添加jar做:

        对于 gradle,只需将以下代码放入 build.gradle:

        dependencies {
        ...
        compile fileTree(dir: 'lib', includes: ['suitetalk-*0.jar'])
        ...
        }
        

        对于 Maven,只需按照以下步骤操作:

        对于 Intellij: 文件->项目结构->模块->依赖选项卡->点击+号->jar和依赖->选择要导入的jar->ok->apply(如果可见)->ok

        请记住,如果您在运行时遇到任何 java.lang.NoClassDefFoundError: Could not initialize class 异常,这意味着未安装 jar 中的依赖项,您必须在父项目中添加所有依赖项。

        【讨论】:

          【解决方案15】:

          使用 Kotlin DSL (build.gradle.kts) 添加本地库文件的更多方法:

          implementation(
              files(
                  "libs/library-1.jar",
                  "libs/library-2.jar",
                  "$rootDir/foo/my-other-library.jar"
              )
          )
          
          implementation(
              fileTree("libs/") {
                  // You can add as many include or exclude calls as you want
                  include("*.jar")
                  include("another-library.aar") // Some Android libraries are in AAR format
                  exclude("bad-library.jar")
              }
          )
          
          implementation(
              fileTree(
                  // Here, instead of repeating include or exclude, assign a list of paths
                  "dir" to "libs/",
                  "include" to "*.jar",
                  "exclude" to listOf("bad-library-1.jar", "bad-library-2.jar")
              )
          )
          

          上面的代码假设库文件在模块的libs/目录下(这里的模块是指这个build.gradle.kts所在的目录)。

          您可以在includes 和excludes 中使用Ant patterns,如上所示。

          有关文件依赖关系的更多信息,请参阅Gradle documentations

          感谢this post 提供有用的答案。

          【讨论】:

            【解决方案16】:

            转到文件->项目结构->模块->应用程序->依赖选项卡->点击+(按钮)->选择文件依赖->选择lib文件夹中的jar文件

            此步骤将自动将您的依赖项添加到 grade

            很简单

            【讨论】:

            • 这是通过某些 Java IDE 菜单的路径吗?可能是想法?
            • 是的,这看起来像是 IntelliJ IDEA 的东西,我认为它不会起作用。或者,在对 Gradle 设置进行更改导致完成“同步”之前,它看起来正在工作,并且同步是从 Gradle 到 IntelliJ 设置的单向。它不会以其他方式同步 - 至少我不这么认为。
            • 如果您选择了自动导入,手动导入的 .JAR 将在下次更改为 build.gradle 时被删除。
            【解决方案17】:

            如果您使用持续集成,请小心,您必须将库添加到构建服务器上的相同路径中。

            出于这个原因,我宁愿将 jar 添加到本地存储库,当然,在构建服务器上也这样做。

            【讨论】:

              【解决方案18】:

              另一种方式:

              在树视图中添加库。右键单击这个。选择菜单“添加为库”。 出现一个对话框,让您选择模块。好的,完成了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-06-20
                • 1970-01-01
                • 1970-01-01
                • 2015-11-13
                • 1970-01-01
                • 1970-01-01
                • 2016-03-28
                • 2014-01-05
                相关资源
                最近更新 更多