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.