Вопрос по gradle – Как определить * только * classpath времени компиляции в Gradle?

62

Может кто-нибудь дать мне простой пример build.gradle, как я могу указать классы только во время компиляции, которые не включены в развертывание во время выполнения (война).

Gradle, кажется, понял это неправильно, начиная с «времени выполнения»; наследуется от «compile». Я не могу представить себе ситуацию, когда во время выполнения я хотел бы, чтобы классы были такими, какие я не хотел бы во время компиляции. Однако есть много обстоятельств, когда мне нужны классы для генерации кода во время компиляции, которые я не хочу развертывать во время выполнения!

Я просмотрел раздутую документацию, но не могу найти четких инструкций или примеров. Я подозреваю, что это может быть достигнуто путем определения «конфигурации»; и установив его как путь к классу плагина CompileJava - но в документации не объясняется, как этого добиться.

я думаю, что текущий правильный ответ - это ответ xsveda, использующий конфигурацию compileOnly. Robert

Ваш Ответ

11   ответов
3

Оказывается, что они добавили «предоставлено» Конфигурация в плагине Android Android Gradle 0.8.0, но это не совсем работает. Он автоматически добавляет предоставленные библиотеки в путь компиляции, но также включает их в окончательный вариант aar / apk.

Для меня сработало решение, предоставленное @ lukas-hanaceck, но изменив имя с «предоставлено». на любое другое имя. В моем случае это библиотечный проект, который зависит от моего окончательного проекта приложения для Android. Вот суть того, что сработало для меня.

configurations {
   providedlibs
}

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

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

Он отлично компилируется, и предоставленный / library.jar не включен в окончательный APK. Единственная проблема, с которой я столкнулся, - это уведомление Android-студии о существовании library.jar. Похоже, плагин идеи не работает для Android-студии. Я предполагаю, что у них есть еще один пользовательский плагин для синхронизации Gradle со студией.

Error: User Rate Limit ExceededprovidedError: User Rate Limit Exceeded1.0.1Error: User Rate Limit Exceeded
2

Я не нашел решения для Android Studio, но вот что я попробовал:

В андроид студии пришлось обновляться до версии 0.5. +

в gradle / gradle-wrapper.properties заменить

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

от

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

во всех моих build.gradle заменить

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

от

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

и в библиотеке я хотел использовать при условии

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

и в конце это не работает, кажется, что это работает для jar, но не для aar или apk, как указано здесьhttps://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA

2

В Android Studio 1.0 сделайте это:

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/someLib.jar')
    }
}
Error: User Rate Limit Exceeded
6

которые не компилируют зависимости времени. Обратный путь - это довольно особый случай, поэтому в Gradle требуется несколько строк конфигурации. Предлагаю поискатьGradle форум заprovided.

Похоже, что вы действительно после того, как объявляете зависимости для вашегоbuild, не для пути к классу компиляции. Как это сделать, зависит от того, как вызывается нужная функциональность (задача Ant, задача / плагин Gradle, специальное использование из скрипта сборки). Если вы предоставите более подробную информацию о том, что вы пытаетесь сделать, я могу дать более конкретный ответ.

Вот несколько ссылок на соответствующую информацию в руководстве пользователя Gradle:

External dependencies for the build script Declaring the class path for a custom Ant task
56

Вот, но не четкий вывод.

Вы на правильном пути: в настоящее время лучшее решение - объявить свой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]
  }
}

Обычно это работает хорошо.

Gradle3: sourceSets.main.compileClasspath += configurations.provided
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededidea { module{ scopes.PROVIDED.plus += [configurations.provided] } }Error: User Rate Limit Exceededforums.gradle.org/gradle/topics/…
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
11

Если вы используетеwar плагин,providedCompile должен сделать свое дело. Однако, если вам нужно исключить зависимости от включения вjarвам придется продлить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/

Update:

По состоянию наGradle 2.12 проблема определения зависимостей только для компиляции в конечном итоге решается простым и естественным образом с помощью новой функции «copmpileOnly»; конфигурация:

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}
Error: User Rate Limit Exceeded
9

Я понял это для настройки моего проекта. Я использую Android Studio с плагином gradle 0.9. + С gradle 1.11 Основной проект использует рекламу Amazon и покупки Amazon Inapp. Это зависит от проекта библиотеки, использующего систему обмена сообщениями на устройстве Amazon (ADM).

Моя основная проблема была связана с ADM, где я получил & quot; RuntimeException: Stub! & Quot; ошибка.

1.) Библиотечный проект: «Предоставленная конфигурация» Предложенный Лукасом не работает, как заявил он, поэтому я использовал подход Ричардса, который, однако, не сработал так хорошо из коробки. Мне пришлось немного изменить его, так как я не смог найти lib в папке ext_libs файла aar. Похоже, что Gradle упаковывает все библиотеки в папке libs в конечном файле aar.

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:[email protected]'
    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
}
Error: User Rate Limit Exceeded
0

по-видимому, не искал ответ Android, но некоторые ответы относятся к Android. Поэтому я предлагаю вам взглянуть на эту страницу:http://tools.android.com/tech-docs/new-build-system

Версия 0.9.0 представила предоставленную область. Так что просто используйте

dependencies {
    provided "groupId:artifcatId:version"
}
0

Мы не нуждаемся в этом, попробуйте добавить это:

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

Наслаждайтесь!

6

Если вы используете плагин WAR, вы можете использоватьprovidedCompile как в этомпример

dependencies {
    compile module(":compile:1.0") {
        dependency ":[email protected]"
        dependency ":providedCompile-transitive:[email protected]"
    }
    providedCompile "javax.servlet:servlet-api:2.5"
    providedCompile module(":providedCompile:1.0") {
        dependency ":providedCompile-transitive:[email protected]"
    }
    runtime ":runtime:1.0"
    providedRuntime ":providedRuntime:[email protected]"
    testCompile "junit:junit:4.11"
    moreLibs ":otherLib:1.0"
}
5

В Gradle 2.12 аcompileOnly Конфигурация была введена. Сообщение в блоге, представляющее эти функции, можно найти здесь:

Gradle последняя функция: компилировать только зависимости

Обратите внимание на один важный побочный эффект:

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.

Похожие вопросы