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

Q L*_*Liu 542 java dependency-management gradle gradle-eclipse 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')
} 
Run Code Online (Sandbox Code Playgroud)

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

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

error: package com.google.gson does not exist
import com.google.gson.Gson;
Run Code Online (Sandbox Code Playgroud)

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

lee*_*eor 619

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

dependencies {
    implementation files('libs/something_local.jar')
}
Run Code Online (Sandbox Code Playgroud)

  • @Gubatron现在记录在案:http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:file_dependencies (8认同)
  • 只是想为那些使用我们jar的相对路径的人添加它:依赖关系{compile files("libs/something_local.jar"}(即双引号而不是单引号)是Groovy需要评估路径的.引用字面意思是在Groovy中. (6认同)
  • 请注意,如果您的 jar 中有外部依赖项,则必须构建一个影子 jar 才能以这种方式使用它,但是,如果您将其发布到本地 Maven 存储库,则没有必要。 (2认同)

Jor*_*e_B 429

如果你真的需要从本地目录中获取.jar,

在模块gradle旁边添加(不是app gradle文件):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}
Run Code Online (Sandbox Code Playgroud)

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

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}
Run Code Online (Sandbox Code Playgroud)

  • 我有一个`gradle.build`文件 - 这些"app gradle文件"和"模块gradle"是什么? (9认同)
  • 我找到了这个,但我发现我的本地存储库不能解决传递依赖.(Gradle 2.7,示例POM是com.mojang:authlib:1.5.21,由minecraftforge.net提取) (3认同)
  • 有人会通过链接到Gradle官方文档的部分来描述这些功能来更新答案吗? (2认同)
  • `implementation(":gson:2.2.4")` 似乎是这样做的方法。 (2认同)

Nig*_*olf 296

您也可以执行此操作,其中包括本地存储库中的所有JAR.这样您就不必每次都指定它.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Run Code Online (Sandbox Code Playgroud)

  • 这用于编译lib目录中的所有jar.它是完美的解决方案(y) (3认同)
  • 请注意, dir 也可以是绝对路径。另外,我不得不使用“包含”而不是“包含”。 (2认同)
  • 对于 gradle 7+,请使用 `implementation fileTree(dir: 'lib', include: ['*.jar'])` (或 `api`,具体取决于您的需要) (2认同)

Mis*_*sha 47

以下适用于我:

compile fileTree(dir: 'libs', include: '*.jar')
Run Code Online (Sandbox Code Playgroud)

请参阅Gradle文档.

  • 精彩的回答,这是我搜索了几天后唯一有效的解决方案 (6认同)
  • 这与@Nightwolf 的回答有何不同? (2认同)
  • 无法在 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象上找到参数 [directory 'libs'] 的方法 compile() (2认同)

Dan*_*ora 32

您可以尝试重用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")  
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 现在,您应该在项目中启用jar进行编译

  • 虽然这有效,但这是一种解决方法,不应该在自动化生产/阶段环境中使用,因为这会增加构建系统中具有 .m2 文件夹(maven 安装)的额外依赖项。 (2认同)

Big*_*ich 28

接受的答案是好的,但是,在我的多项目Gradle构建中我需要各种库配置来使用相同的第三方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()
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请务必使用双引号而不是单引号,因为后者不会被插值. (4认同)
  • 这不适用于Gradle 2.3 (3认同)
  • 但如何在库build.gradle文件中引用此libs文件夹?任何帮助. (2认同)

Top*_*era 15

较短的版本:

dependencies {
    implementation fileTree('lib')
}
Run Code Online (Sandbox Code Playgroud)


小智 12

一个简单的方法是

compile fileTree(include: ['*.jar'], dir: 'libs')
Run Code Online (Sandbox Code Playgroud)

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

  • 这与@Nightwolf 的回答有何不同? (2认同)

Mah*_*zad 10

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

implementation(
    files(
        "libs/library-1.jar",
        "libs/library-2.jar",
        "$rootDir/foo/my-other-library.jar"
    )
)
Run Code Online (Sandbox Code Playgroud)
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")
    }
)
Run Code Online (Sandbox Code Playgroud)
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")
    )
)
Run Code Online (Sandbox Code Playgroud)

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

您可以在s 和s中使用Ant 模式,如上所示。includeexclude

有关文件依赖项的更多信息,请参阅Gradle 文档。

感谢这篇文章提供了有用的答案。


Han*_*kCa 8

我无法在/sf/answers/1466951951/上获得上述建议.这虽然对我有用.对于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'
Run Code Online (Sandbox Code Playgroud)


Jon*_*rum 8

针对使用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")
}
Run Code Online (Sandbox Code Playgroud)

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

...
compile(files("C:\\path\\to\\file.jar"))
...
Run Code Online (Sandbox Code Playgroud)

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

  • @KareemJeiroudi 我可能误解了你的问题,但如果你正在谈论使模块成为项目的依赖项,你会做这样的事情:`compile(project(":MyProject"))`,其中定义了“MyProject”在你的 `settings.gradle` 文件中使用类似 `include("MyProject")` 的内容。 (2认同)

icy*_*sor 6

该问题已经得到了详细的答复.我还想添加一些对我来说非常令人惊讶的东西:

"gradle dependencies"任务不会列出任何文件依赖项.即使你可能这么认为,因为它们已经在"依赖"块中被指定了.

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

  • 哇,我希望 3 小时前读到你的答案!谢谢。这是 Gradle 人员给我们开发人员带来的另一个真正的问题。 (3认同)

Jin*_*tin 6

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Run Code Online (Sandbox Code Playgroud)


pcs*_*nak 5

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

dependency{
    compile files('path.jar')
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

498384 次

最近记录:

6 年 前