Programing

Gradle에서 컴파일 시간 * 전용 * 클래스 경로를 어떻게 정의합니까?

lottogame 2020. 11. 28. 08:36
반응형

Gradle에서 컴파일 시간 * 전용 * 클래스 경로를 어떻게 정의합니까?


누군가가 런타임 배포 (war)에 포함되지 않은 컴파일 시간 전용 클래스를 지정할 수있는 방법에 대한 간단한 build.gradle 예제를 제공 할 수 있습니까?

Gradle은 'runtime'이 'compile'에서 상속되기 때문에 잘못된 방식으로 얻은 것 같습니다. 컴파일 타임에 원하지 않는 클래스를 런타임에 원하는 상황을 상상할 수 없습니다. 그러나 런타임에 배포하고 싶지 않은 컴파일 타임에 코드를 생성하기 위해 클래스가 필요한 상황이 많이 있습니다!

나는 부풀어 오른 gradle 문서를 훑어 보았지만 명확한 지침이나 예를 찾을 수 없습니다. 나는 이것이 '구성'을 정의하고 그것을 CompileJava 플러그인의 클래스 경로로 설정함으로써 달성 될 수 있다고 생각하지만 문서는 이것을 달성하는 방법을 설명하는 데 부족합니다.


주로 여기 에서이 주제에 대해 많은 논의가 있었지만 명확한 결론은 아닙니다.

올바른 방향으로 가고 있습니다. 현재 가장 좋은 해결책은 provided컴파일 전용 종속성을 포함하고 컴파일 클래스 경로에 추가 할 자체 구성 을 선언 하는 것입니다.

configurations{
  provided
}

dependencies{
  //Add libraries like lombok, findbugs etc
  provided '...'
}

//Include provided for compilation
sourceSets.main.compileClasspath += [configurations.provided]

// optional: if using 'idea' plugin
idea {
  module{
    scopes.PROVIDED.plus += [configurations.provided]
  }
}

// optional: if using 'eclipse' plugin
eclipse {
  classpath {
    plusConfigurations += [configurations.provided]
  }
}

일반적으로 이것은 잘 작동합니다.


전쟁 플러그인 을 사용하는 경우 providedCompile트릭을 수행해야합니다. 그러나 jar 에 포함되는 종속성을 제외해야하는 경우 jar작업 을 확장 해야합니다. 다음은 표시된 종속성을 제외하고 "fat jar"또는 "uber jar"(모든 종속성 클래스를 포함하는 단일 jar)를 빌드하는 예입니다 provided.

configurations {
    provided
    compile.extendsFrom provided
}

dependencies {
    provided "group.artifact:version"
    compile "group.artifact:version"
}

jar {
    dependsOn configurations.runtime
    from {
        (configurations.runtime - configurations.provided).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    } 
}

크레딧 : http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

최신 정보:

현재로 Gradle을 2.12 만 결국 새로운 "copmpileOnly"구성하여 단순하고 자연적인 방법으로 해결 종속성 컴파일을 정의의 문제 :

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}

내 프로젝트 설정을 위해 알아 냈습니다. gradle 1.11과 함께 gradle 플러그인 0.9. +로 실행되는 Android Studio를 사용합니다. 주요 프로젝트는 아마존 광고와 아마존 인앱 구매를 사용합니다. Amazon Device Messaging (ADM)을 사용하는 라이브러리 프로젝트에 따라 다릅니다.

내 주요 문제는 ADM에서 "RuntimeException : Stub!"이 발생했습니다. 오류.

1.) 도서관 프로젝트 : Lukas가 제안한 "제공된 구성"이 그에 의해 언급 된대로 작동하지 않으므로 Richards 접근 방식을 사용했지만 기본적으로 제대로 작동하지 않았습니다. aar 파일의 ext_libs 폴더에서 lib를 찾을 수 없기 때문에 약간 변경해야했습니다. Gradle은 최종 aar 파일의 libs 폴더에 모든 라이브러리를 압축하는 것 같습니다.

android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( 'libs/amazon-device-messaging-1.0.1.jar' )
}

2.) 응용 프로젝트 : 여기서는 "제공된 구성"을 사용한 접근 방식이 작동했습니다.

configurations{
    provided
} 
dependencies {
    compile 'fr.avianey:facebook-android-api:+@aar'
    compile files('ext_libs/amazon-ads-5.3.22.jar')
    compile files('ext_libs/in-app-purchasing-1.0.3.jar' )
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar')
}

android.applicationVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}

컴파일 시간 종속성이 아닌 런타임 종속성이있는 것은 매우 일반적입니다. 다른 방법은 상당히 특별한 경우이며 Gradle에서 몇 줄의 구성이 필요합니다. 나는 검색하는 것이 좋습니다 Gradle을 포럼 에 대한을 provided.

당신이 정말로 추구하는 것은 컴파일 클래스 경로가 아닌 빌드에 대한 종속성을 선언하는 것 같습니다 . 이 작업을 수행하는 방법은 원하는 기능이 호출되는 방법 (Ant 작업, Gradle 작업 / 플러그인, 빌드 스크립트에서 임시 사용)에 따라 다릅니다. 수행하려는 작업에 대해 더 자세한 정보를 제공하면 더 구체적인 답변을 제공 할 수 있습니다.

다음은 Gradle 사용자 가이드의 관련 정보에 대한 링크입니다.


If you use the WAR plugin, you can use providedCompile as in this example

dependencies {
    compile module(":compile:1.0") {
        dependency ":compile-transitive-1.0@jar"
        dependency ":providedCompile-transitive:1.0@jar"
    }
    providedCompile "javax.servlet:servlet-api:2.5"
    providedCompile module(":providedCompile:1.0") {
        dependency ":providedCompile-transitive:1.0@jar"
    }
    runtime ":runtime:1.0"
    providedRuntime ":providedRuntime:1.0@jar"
    testCompile "junit:junit:4.11"
    moreLibs ":otherLib:1.0"
}

In Gradle 2.12 a compileOnly configuration has been introduced. A blog post introducing this features can be found here:

Gradle latest feature: Compile only dependencies

Please be aware of one important side effect:

As a result of the addition of the “compileOnly” configuration, the “compile” configuration no longer represents a complete picture of all compile time dependencies. When needing reference a compile classpath in build scripts or custom plugins, the appropriate source set’s compileClasspath property should be used instead.


It turns out that they have added a "provided" configuration in the gradle android plugin 0.8.0 but it doesn't quite work. It does add the provided libraries to the compile path automatically, but it also includes them in the final aar/apk.

What worked for me was the solution provided by @lukas-hanaceck but by changing the name from "provided" to any other custom name. In my case this is a library project which is a dependency for my final android application project. Heres a gist of what worked for me.

configurations {
   providedlibs
}

dependencies {
   providedlibs files('provided/library.jar')
}

libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.providedlibs
}

It compiles perfectly and the provided/library.jar is not included in the final apk. The only issue I am having is notifying Android studio of the existence of library.jar. The idea plugin doesn't seem to work for Android studio. Im guessing that they have another custom plugin for syncing gradle with studio.


I didnt find a solution for Android Studio, but this what I tried:

In android studio I had to update to version 0.5.+

in gradle/gradle-wrapper.properties replace

distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip

by

distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip

in all my build.gradle replace

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.+'
    }
}

by

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

and in the library I wanted to use provided

configurations {
    provided
}

//put applicationVariants in case it is apply plugin: 'android' and not apply plugin: 'android-library'
android.libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}

dependencies {
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar')
}

and at the end it doesnt work, it seems that it works for jar but not for aar or apk as stated here https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA


In Android Studio 1.0 do this:

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/someLib.jar')
    }
}

We don't need "provided", try to add this:

android.libraryVariants.all { variant ->
    variant.packageLibrary.exclude( 'ext_libs/amazon-device-messaging-1.0.1.jar' )
}

Enjoy!


The OP apparently didn't look for an Android answer, but some answers are specific to Android. So I suggest you look at this page : http://tools.android.com/tech-docs/new-build-system

Version 0.9.0 introduced a provided scope. So, just use

dependencies {
    provided "groupId:artifcatId:version"
}

참고URL : https://stackoverflow.com/questions/10405970/how-do-i-define-a-compile-time-only-classpath-in-gradle

반응형