build.gradle 파일에 로컬 .jar 파일 종속을 추가하는 방법?


606

따라서 로컬 .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')
} 

그리고 당신은 여기에서 referenceLibraries 폴더에 .jar 파일을 추가 한 것을 볼 수 있습니다 : 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

3
jar을 빌드 할 수없는 경우 컴파일 종속성 인 것처럼 보입니다. 시도 : 여전히 문제가있는 경우 파일을 컴파일하십시오 ( 'libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') 또한 문제가 될 수있는 절대 경로를 시도하십시오.
patrz jaka franca

1
스택 오버플로 질문은 마침내 필요한 답변을 주었다.
크레인

답변:


456

로컬 디렉토리에서 해당 .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
. 내가 정확히 찾아왔다,하지만 난 내 로컬 저장소 이적 종속성을 해결하지 않는 것으로 확인 (: authlib : Gradle을 2.7, 예를 들어, POM은 com.mojang입니다 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")그것을하는 방법 인 것 같습니다.
Eng.Fouad

697

documentation 에 따르면 다음과 같이 로컬 jar 종속성에 대한 상대 경로를 사용하십시오.

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

8
@Gubatron 그것은 지금 문서화 : gradle.org/docs/current/userguide/…
David Moles

7
단지 jar에 상대 경로를 사용하는 사람들을 위해 다음을 추가하고 싶었습니다. 의존성 {compile files ( "libs / something_local.jar"} (즉, 작은 따옴표가 아닌 큰 따옴표)는 경로를 평가하기 위해 Groovy에 필요합니다. 인용문은 Groovy에서 문자 그대로 사용됩니다.
specialk1st

그래서 같은 것을 사용하고 컴파일 오류가 발생합니다 (병을 찾지 못하는 것처럼 보입니다). 절대 경로를 지정하면 제대로 작동합니다.
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 디렉토리를 공유하지 않는 한.
Ajax

이것은 파일의 위치를 ​​명시 적으로 나타 내기 때문에 허용 된 답변보다 선호하는 구현입니다. 일부 라이브러리의 경우 mavenCentral과 다른 라이브러리의 로컬 사본과 같은 저장소를 참조 할 때 유용합니다. 이 경우 gradle이 다른 리포지토리에서 로컬 라이브러리를 검색하는 동안 지연이 발생할 수 있습니다.
satbot

1
dir도 절대 경로가 될 수 있습니다. 또한 'include'대신 'includes'를 사용해야했습니다.
eriel marimon

53

다음은 나를 위해 작동합니다.

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

Gradle 설명서를 참조하십시오 .


6
훌륭한 답변, 며칠 동안 검색 한 후 저에게 도움이 된 유일한 솔루션
Stardust

특정 라이브러리를 프로젝트와 함께 컴파일하지 않으려면이 방법을 기억해야합니다 .libs 폴더에서 삭제해야한다는 것을 기억해야합니다 ... 나는 어떤 라이브러리를 볼 수 없기 때문에이 방법을 좋아하지 않습니다. 내가 도서관에 들어 가지 않는 한 추가
예수 Dimrix

1
@Nightwolf의 답변과 다른 점은 무엇입니까?
Trenton

2
형 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler의 객체에 인수 [디렉토리 'libs와']에 대한 방법 컴파일 ()을 (를) 찾을 수 없습니다
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을 구현할 수 있어야합니다.

이것은 다른 모든 것이 실패했을 때 나를 도왔습니다!
사용자 3

이것이 작동하는 동안 이것은 해결 방법이며 빌드 시스템에 .m2 폴더 (maven installation)가 추가로 필요하기 때문에 자동화 된 프로덕션 / 무대 환경에서 사용해서는 안됩니다.
saurav.varma

29

받아 들일만한 대답은 좋지만 동일한 타사 Java 라이브러리를 사용하려면 다중 프로젝트 Gradle 빌드 내에 다양한 라이브러리 구성이 필요했을 것입니다.

내 ' 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()
    }

    ...
}

퀴즈 편집 : "$ {rootProject.projectDir}"을 "$ rootProject.projectDir"(최신 Gradle 버전에서 작동)로 변경했습니다.


2
그러나 라이브러리 build.gradle 파일 에서이 libs 폴더를 참조하는 방법은 무엇입니까? 그것에 대한 도움.
jeevs

1
"$ {rootProject.projectDir}"을 "$ rootProject.projectDir"로 변경하면 다시 작동합니다.
Quizzie

4
후자는 보간되지 않으므로 작은 따옴표 대신 큰 따옴표를 사용해야합니다.
FP 자유롭게

1
이 접근 방식이 도움이되었습니다.
Shreyash

1
여기에있는 모든 대답은 저에게 많은 도움이되었습니다. 이 패턴은 우리가 사용하는 패턴이며 팀에서 일하는 사람들이 지점에서 작업 할 때 JAR을 해당 디렉토리에 쉽게 넣을 수 있습니다.
루시

12

이를 수행하는 간단한 방법은

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

App의 libs 디렉토리에있는 모든 .jar 파일을 컴파일합니다.


fileTree는 libs 폴더의 모든 하위 디렉토리에서 작동합니다. libs / sping / spring.jar 안에 몇 개의 항아리가 있습니다.이 경우 spring .jar도 포함됩니까?
mgr

아닙니다. 기술적으로 하위 디렉토리가 아닌 'dir : libs'를 제공하기 때문에 그렇게해서는 안됩니다.
ZygoteInit

이 경우 최소한의 작업으로 하위 디렉토리에서 모든 라이브러리를 얻는 방법 (프로젝트에 너무 많은 하위 디렉토리가 포함되어 있기 때문에)
mgr

@mallikgm 님, 답변이 늦어 죄송합니다. 컴파일 fileTree (include : [ ' .jar'], dir : 'libs ') 와 같은 dir 경로에 와일드 카드를 추가해 보셨습니까?
ZygoteInit

2
@Nightwolf의 답변과 다른 점은 무엇입니까?
Trenton

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찬성 implementation하고 testImplementation. 따라서 위의 의존성 블록은 현재 Gradle 버전에서 다음과 같습니다.

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

1
+1이 나를 위해 일했습니다! jar 파일을 생성하지 않고도 동일한 작업을 수행하는 방법을 알고 있습니까 (병을 생산하는 경우)?
Kareem Jeiroudi

2
@KareemJeiroudi 내가 질문을 오해 할 수 있지만,이 모듈을 프로젝트의 종속성을 이야기하는 경우,이 같은 것을 할 것입니다 : compile(project(":MyProject"))"MyProject를"가 당신에 정의되어 settings.gradle같은과 파일을 include("MyProject").
Jonathan Landrum

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

아냐, 이것은 효과가 없다. : miglayout-core :를 찾을 수 없었다. 다음 위치에서 검색 : file : /user/path/to/miglayout-core.jar
Well Smith

저장소로 파일 디렉토리를 추가하려는 경우이 작업 : docs.gradle.org/current/userguide/…
Grubhart

7

질문은 이미 자세히 답변되었습니다. 나는 아직도 나에게 매우 놀라운 것을 추가하고 싶다 :

"gradle dependencies"태스크는 파일 종속성을 나열하지 않습니다. 비록 "종속성"블록에 지정된대로 생각할 수도 있지만 ..

따라서 참조 된 로컬 lib 파일이 올바르게 작동하는지 확인하기 위해이 결과에 의존하지 마십시오.


6

나를 위해 일한 해결책은 build.gradle 파일의 fileTree 사용법입니다. libs 폴더에 종속성으로 추가해야하는 .jar을 유지하십시오. build.gradle의 dependenices 블록에 아래 코드를 제공하십시오.

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

5

가장 좋은 방법은 build.gradle 파일에 이것을 추가하고 sync 옵션을 누르는 것입니다.

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

3

항아리를 추가 할 수 있습니다 :

gradle의 경우 다음 코드를 입력하십시오 build.gradle.

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

그리고 maven의 경우 다음 단계를 따르십시오.

Intellij의 경우 : 파일-> 프로젝트 구조-> 모듈-> 종속성 탭-> + 기호-> jar 및 종속성-> 가져올 jar 선택-> 확인-> 적용 (표시 된 경우)-> 확인

java.lang.NoClassDefFoundError: Could not initialize class런타임에 예외가 발생 하면 jar의 종속성이 설치되지 않았으므로 상위 프로젝트의 모든 종속성을 추가해야 함을 의미합니다.


0

파일로 이동-> 프로젝트 구조-> 모듈-> 앱-> 종속성 탭-> + (버튼) 클릭-> 파일 종속성 선택-> lib 폴더에서 jar 파일 선택

이 단계는 의존성을 gralde에 자동으로 추가합니다.

매우 간단


3
이것이 Java IDE 메뉴를 통과하는 경로입니까? 아마 아이디어?
Utgarda 2016 년

1
예, IntelliJ IDEA의 것으로 보이며 작동하지 않을 것이라고 생각합니다. 또는 Gradle 설정이 변경되어 "동기화"가 수행되고 Gradle에서 IntelliJ 설정으로의 동기화가 이루어질 때까지 작동하는 것처럼 보입니다. 다른 방법으로는 동기화하지 않습니다. 적어도 나는 그렇게 생각하지 않습니다.
RenniePet

1
자동 가져 오기를 선택한 경우 다음으로 변경하면 수동으로 가져온 .JAR이 제거됩니다 build.gradle.
Jonathan Landrum

-1

지속적인 통합을 사용하는 경우 빌드 서버의 동일한 경로에 라이브러리를 추가해야합니다.

이러한 이유로 로컬 저장소에 jar을 추가하고 빌드 서버에서 동일하게 수행합니다.


-3

또 다른 방법:

트리 뷰에서 라이브러리를 추가하십시오. 이것을 오른쪽 클릭하십시오. "라이브러리로 추가"메뉴를 선택하십시오. 대화 상자가 나타나면 모듈을 선택할 수 있습니다. 알았어. 끝났어.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.