Gradle : 클래스 경로와 컴파일 종속성의 차이점은 무엇입니까?


92

내 프로젝트에 종속성을 추가 할 때 나는 결코 확실히 내가 그들을 제공해야 접두어 무엇이다, 예를 들어, "classpath"또는"compile".

예를 들어 아래의 내 종속성은 컴파일 시간 또는 클래스 경로 여야합니까?

또한 내 애플리케이션 build.gradle 또는 모듈 별 build.gradle에 있어야합니까?

현재 build.gradle (애플리케이션 수준) :

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

1
이해가 잘 안됩니다. classpath유효한 종속성 범위가 아닙니다.
— Tunaki

아마도 혼란 스러울 것입니다. 유효한 종속성 범위는 무엇입니까?
— java123999

이 문서를 살펴 보자 : docs.gradle.org/current/userguide/...
— Tunaki

내가 발견 한 가지는 것입니다 compileOnly의존성로 이동 project.configurations.compileClasspath하지만에 project.configurations.compile여기에 언급 한 바와 같이, github.com/iboyko/gradle-plugins/issues/5
— 한다 Vytenis Bivainis을

답변:


47

나는 당신이 참조 compile하고 classpath있고 dependencies {}블록 내에 있다고 추측 할 것 입니다. 그렇다면 종속성 구성 입니다.

구성은 단순히 명명 된 종속성 집합입니다.

compile구성은 자바 플러그인에 의해 생성된다. classpath구성은 일반적으로 보이는 buildSrc {}사람이 종속성을 선언해야 블록 build.gradle, 자체 (플러그 용 아마도).


감사합니다. 기본 build.gradle에 대해 클래스 경로를 사용할 필요가 없습니까?
— java123999

@ java123999 아니, 당신은 사용자가 작성한 플러그인을 사용하지 않는 한
— 에릭 빈데을

@EricWendelin "within the dependencies {} block"이라고 말하면 "within the buildscript {dependencies {}} block"을 의미합니까? (나는 확실히, 그냥 물어 아니에요.)
— 파울로 Merson

2
dependencies {}블록은 모두 내부에 선언 될 수있다 buildscript {}그 밖에있다. 내부에서는 classpath빌드 스크립트 자체를 컴파일하는 데 필요한 종속성에 대한 구성을 사용합니다 .
— Eric Wendelin

55

만약 buildscript 자체가 실행 뭔가, 사용이 필요 클래스 경로를 .

프로젝트를 실행해야하는 경우 compile을 사용하십시오 .

buildscript{}블록은 build.gradle 자체이다.

다중 프로젝트 빌드의 경우 최상위 빌드 파일은 루트 프로젝트 용이고 특정 빌드 파일은 하위 프로젝트 (모듈) 용입니다.

모든 하위 프로젝트 / 모듈에 공통적 인 구성 옵션을 추가 할 수있는 최상위 빌드 파일입니다.

애플리케이션 종속성을 최상위 빌드 파일에 배치하지 마십시오. 개별 모듈 build.gradle 파일에 속합니다.


확인하려면 : proandroiddev.com/… 이 a compile가 아닌 a 를 사용해야 한다는 의미 classpath입니까?
— WillC

1
그러나 프로젝트에 일반적인 안드로이드 애플리케이션과 같이 모듈이 하나만있는 경우 애플리케이션 종속성을 최상위 파일 자체에 배치하지 않는 이유는 무엇입니까?
— Harsha

18

내가 올바르게 이해한다면 Project.dependencies스크립트 블록과 스크립트 블록을 혼동하는 것입니다 Project.buildscript.dependencies(이 질문에 도달했을 때와 마찬가지로).

나는 내가 찾은 것으로 대답하려고 노력할 것이다.

이미 Project.dependencies스크립트 블록에 익숙해야한다고 생각합니다 . 이 블록에서는 소스 코드에 필요한 종속성을 선언합니다. 프로젝트에 필요한 종속성을 선언하는 방법에는 여러 가지가 있습니다. Gradle 자습서 : 종속성 유형을 참조하십시오 . 이 문제와 가장 관련이있는 부분 만 언급하겠습니다.

compile 'org.hibernate:hibernate-core:5.0.5.Final'모듈 종속성 선언입니다. 컴파일 구성 (이제는 구현 구성에서 더 이상 사용되지 않습니다.)은 단지 Implementation only dependencies.어떤 유형의 종속성인지를 설명하는 키워드가 아닙니다 (여기서 유형별로 저는 자습서에 정의 된 세 가지 유형, 즉 모듈, 파일 및 프로젝트.)

에서 Gradle을 자습서 : 빌드 로직을 구성하기 는 말합니다 :

빌드 스크립트에서 외부 라이브러리를 사용해야하는 경우 빌드 스크립트 자체의 스크립트 클래스 경로에 추가 할 수 있습니다. buildscript () 메서드를 사용하여 빌드 스크립트 클래스 경로를 선언하는 클로저를 전달합니다.

이는 예를 들어 Java 컴파일 클래스 경로를 선언하는 것과 동일한 방법입니다. 프로젝트 종속성을 제외하고 종속성 유형에 설명 된 모든 종속성 유형을 사용할 수 있습니다.

빌드 스크립트 클래스 경로를 선언했으면 클래스 경로의 다른 클래스와 마찬가지로 빌드 스크립트의 클래스를 사용할 수 있습니다.

이제 상황이 명확 해지기를 바랍니다.

으로 classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"우리가 설정하는 classpath방법을 함께 com.android.tools.build:gradle:${Versions.android_gradle_plugin}하는 빌드 스크립트 자체보다는 프로젝트의 소스에서 사용되는 모듈 종속성입니다.

반면에 compile 'org.hibernate:hibernate-core:5.0.5.Final'compile configuration 을 사용하여 프로젝트에 필요한 모듈 종속성을 선언 합니다 .

TL; DR 다음 classpath, compile그리고 implementation서로 다른 상황에서 종속에 대해 사용할 수있는 모든 키워드입니다. 전자는 빌드 스크립트에 종속성을 전달하려는 경우 사용되며 후자는 선언하려는 구성 중 하나입니다 .


1
좋은 대답입니다. 위에서 잘 설명한대로 키워드 자체를 응시해야 할뿐만 아니라 키워드만으로는 완전한 컨텍스트를 정의하지 않기 때문에 요청되는 아티팩트도 고려해야합니다. 예를 들어, 'org.projectlombok:lombok:1.18.4'는 classpath컴파일 javac시간 에만 필요 하지만 java런타임 에는 필요하지 않기 때문에 연관 이 없습니다 . 따라서 올바른 사용은 정의 된 키워드와 아티팩트의 상호 작용입니다. 이것은 사전 지식이 필요하다는 것을 의미합니다.
— eigenfield
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.