ChatGPT解决这个技术问题 Extra ChatGPT

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

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

a
acdcjunior

根据 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 的相对路径的人添加它:Groovy 需要依赖项 { compile files("libs/something_local.jar" } (即双引号而不是单引号)来评估路径。单引号在 Groovy 中按字面意思表示。
所以我使用相同的东西,我得到编译错误(看起来它在那里找不到jar。)如果我给出绝对路径它工作正常。
我更喜欢这个解决方案,但我发现如果文件不存在,Gradle 不会输出错误。我亲自找到了这个,有关详细信息,请参阅此 SO 问题:stackoverflow.com/q/42527631/4851565
请注意 - 如果您的 jar 中有外部依赖项,则必须构建一个影子 jar 才能以这种方式使用它,但是,如果您将其发布到本地 maven 存储库,则没有必要。
A
AMK

如果您确实需要从本地目录中获取该 .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") 似乎是这样做的方法。
N
Nightwolf

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

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

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

以下对我有用:

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'])”
A
AMK

您可以尝试为 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 以在项目中实现

现在您应该启用 jar 以在您的项目中实现


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

使用 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")
c
centic

公认的答案很好,但是,我需要在我的多项目 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 拖放到该目录中即可。
T
Topera

较短的版本:

dependencies {
    implementation fileTree('lib')
}

i
icyerasor

问题已经详细回答了。我仍然想添加一些让我感到非常惊讶的东西:

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

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


哇,我希望我在 3 小时前读到你的答案!谢谢。这是 Gradle 人员为我们开发人员提供的另一个真正的问题。
Z
ZygoteInit

一个简单的方法是

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 的回答有何不同?
C
Community

我无法在 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/…
p
pcsaunak

最好的方法是将其添加到您的 build.gradle 文件中并点击同步选项

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

J
Jince Martin

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

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

a
ankit

您可以添加罐子做:

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

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

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

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

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


M
Mahozad

使用 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(
        "dir" to "libs/",
        // Here, instead of repeating include or exclude, assign a list of paths
        "include" to "*.jar",
        "exclude" to listOf("bad-library-1.jar", "bad-library-2.jar")
    )
)

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

如上所示,您可以在 includeexclude 中使用 Ant patterns

有关文件依赖项的详细信息,请参阅 Gradle documentations

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


S
Shandilya

对于带有 Groovy 构建文件的 Gradle 7.4 版

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    implementation ':gson-2.2.4'
}

l
leonheess

如果您使用的是 gradle 4.10 或更高版本:

implementation fileTree(dir: 'libs', includes: ['*.jar'])

J
Jaya

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

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

很简单


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

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

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


e
emmanuel

另一种方式:

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