如何将本地.jar文件依赖项添加到build.gradle文件?


605

所以我试图将我的本地.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


您确定要运行时而不是编译吗?编译文件(....)
Gabriele Mariotti 2013年

3
如果无法构建jar,它看起来像是编译依赖项。尝试:编译文件(“ libs / mnist-tools.jar”,“ libs / gson-2.2.4.jar”),如果仍然有问题,请尝试使用绝对路径,因为这也可能是问题。
patrz jaka franca

1
这个堆栈溢出问题终于给了我所需的答案。
2014年

Answers:


455

如果您确实需要从本地目录中获取该.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'
}

4
我来找正是这样,但是我发现我的本地存储库无法解析可传递的依赖关系。(等级2.7,示例POM为com.mojang:authlib:1.5.21,由minecraftforge.net提取)
异教徒卡尔

1
如果您在多个目录中有本地jar文件,则需要将它们全部添加到flatDir中。例如:-flatDir {dirs'libs1','libs2','libs3'}
Dhumil Agarwal

9
我有一个gradle.build文件-这些“应用程序gradle文件”和“模块gradle”是什么?
Lealo

2
有人会通过链接到Gradle官方文档的链接描述这些功能来更新答案吗?
misanthrope

2
implementation(":gson:2.2.4")似乎是这样做的方法。
Enu.Fouad

697

根据文档,对本地jar依赖项使用相对路径,如下所示:

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


7
只是想为那些使用相对于我们jar的相对路径的人添加一个:Groovy需要依赖项{compile files(“ libs / something_local.jar”}(即双引号而不是单引号)来评估路径。引号字面上看在Groovy。
specialk1st

因此,我使用的是同一件事,并且我得到编译错误(看起来它在那里找不到jar。)如果我给出绝对路径,它就可以正常工作。
RV_Dev

我更喜欢这种解决方案,但是我发现如果文件不存在,Gradle将不会输出任何错误。我已经亲自找到了,有关详细信息,请参见以下SO问题:stackoverflow.com/q/42527631/4851565
entpnerd

即使使用此解决方案后,我也收到类似的错误。错误我确实将libs文件夹放在与应用程序不在同一级别的应用程序下
Rishabh Dugar

314

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

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

3
这用于编译lib目录中的所有jar。它是完美的解决方案(y)
Sheraz Ahmad Khilji

1
...除非您计划与具有不同依赖关系集的不同模块共享该libs目录,例如不将服务器代码与客户端代码放在一起,或者在不同子模块中具有一个以上版本的依赖关系。
阿贾克斯

与已接受的答案相比,这是我的首选实现方式,因为它明确指出了文件的位置。当您在某些库中引用诸如mavenCentral之类的存储库而在另一些库中引用本地副本时,此功能非常有用。在这种情况下,gradle在其他存储库中搜索本地库时可能会有所滞后。
satbot's

1
请注意,dir也可以是绝对路径。另外,我不得不使用“ includes”代替“ include”。
艾里尔·马里蒙

53

以下对我有用:

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

请参阅Gradle文档


6
绝妙的答案,是在搜索了几天后唯一对我
Stardust

重要的是要记住,如果您不希望特定的库与您的项目一起编译,则必须使用该方法,您必须记住将其从libs文件夹中删除...我不喜欢这种方法,因为我看不到我使用的是哪个库添加,除非我进入图书馆
Jesus Dimrix

1
这与@Nightwolf的答案有何不同?
特伦顿

2
在类型org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler的对象上找不到参数[目录'libs']的方法compile()
ieXcept

33

您可以尝试为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以便实施

当其他所有方法都失败时,这一方法对我有所帮助!
User3

尽管这可行,但这是一种变通方法,不应在自动化生产/阶段环境中使用,因为这会增加在构建系统中具有.m2文件夹(Maven安装)的依赖性。
saurav.varma '18

29

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

在我的' allprojects '闭包中的' dir '路径元素中添加' $ rootProject.projectDir ' 意味着每个子项目都引用相同的' 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版本中有效)。


2
但是如何在库build.gradle文件中引用此libs文件夹?任何帮助。
jeevs 2015年

1
只需将“ $ {rootProject.projectDir}”更改为“ $ rootProject.projectDir”即可使其再次运行。
Quizzie 2015年

4
确保使用双引号而不是单引号,因为后者不会被内插。
FP

1
这种方法帮助了我。
Shreyash19年

1
这里的所有答案对我都有很大帮助。这种模式是我们正在使用的一种模式,它使团队中的工作人员在分支机构上工作时轻松地将JAR放入该目录中。
露西

12

一个简单的方法是

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

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


是fileTree适用于libs文件夹中的所有子目录。例如在libs / sping / spring.jar中有几个jar,在这种情况下,它是否还包括spring .jar?
mgr

不,不是。从技术上讲,它也不应该如此,因为我们给的是'dir:libs'而不是libs的子目录。
ZygoteInit

在这种情况下,如何以最少的任务从子目录中获取所有库(因为我们的项目包含许多子目录
。– mgr

嘿@mallikgm对不起,您延迟回复,您是否尝试在目录路径中添加通配符,例如compile fileTree(include:['. jar'],dir:'libs ')
ZygoteInit

2
这与@Nightwolf的答案有何不同?
特伦顿

10

针对使用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
+1为我工作!您是否知道不必生成jar文件(如果我碰巧生成了jar),该怎么做?
卡里姆·耶洛迪

2
@KareemJeiroudi我可能会误解您的问题,但是如果您要谈论的是使模块成为项目的依赖项,则您将执行以下操作:compile(project(":MyProject"))settings.gradle文件中使用“”定义“ MyProject” include("MyProject")
乔纳森·兰德鲁姆

8

我无法在https://stackoverflow.com/a/20956456/1019307上获得上述建议以进行工作。虽然这对我有用。对于secondstring-20030401.jar我存储在libs/项目根目录中的目录中的文件:

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扩展名。
anon58192932 '17

不,这对我不起作用找不到:miglayout-core:。在以下位置搜索:file:/user/path/to/miglayout-core.jar
Well Smith,

如果您想将文件目录添加为存储库,则可以完成此工作:docs.gradle.org/current/userguide/…–
Grubhart

7

该问题已得到详细解答。我仍然想添加一些令我惊讶的东西:

“ gradle依赖项”任务没有列出任何文件依赖项。即使您可能会这样认为,因为它们毕竟是在“依赖项”块中指定的。

因此,请勿依靠此输出检查引用的本地lib文件是否正常工作。


6

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

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

5

最好的方法是将其添加到build.gradle文件中,然后单击sync选项

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

3

您可以添加jar做:

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

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

对于Maven,只需执行以下步骤:

对于Intellij:文件->项目结构->模块->依赖项选项卡->单击+标记-> jar和依赖项->选择要导入的jars->确定->应用(如果可见)->确定

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


0

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

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

很简单


3
那是通过某些Java IDE菜单的路径吗?大概是主意吗?
Utgarda

1
是的,对于IntelliJ IDEA来说,它看起来有些像,但我认为它不会起作用。或者,直到对Gradle设置进行更改(导致完成“同步”),并且同步是从Gradle到IntelliJ设置的一种方式,它似乎一直在工作。它不会以其他方式同步-至少我不这么认为。
RenniePet '16

1
如果您选择了自动导入,则在对进行下一次更改时,将删除手动导入的.JAR build.gradle
乔纳森·兰德鲁姆

-1

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

出于这个原因,我宁愿将jar添加到本地存储库中,并且当然要在构建服务器上执行相同的操作。


-3

另一种方式:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.