2012-05-01 2 views
62

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

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

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

+2

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

ответ

56

Было много обсуждений по этой теме, главным образом here, но не ясный вывод.

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

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

+0

Это работает очень хорошо. – oers

+3

Кто-нибудь получил это для работы с Android Studio и gradle 1.9? –

+0

вы можете найти предоставленное определение области на нескольких сайтах. но часть плагина ide помогла мне многое! – vvursT

6

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

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

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

6

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

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" 
} 
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 

во всей моей сборки.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') 
} 

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

0

Нам не нужно «при условии», попробуйте добавить это:

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

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

9

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

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

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 
} 
+0

Я могу подтвердить, что решение Exlude библиотечных работ для применить плагин : 'com.android.library ', трюк заключается в том, чтобы исключить его из «libs», даже если у вас есть lib в любой другой папке, как написано выше, в графе все это в папку libs. Большое спасибо Майку. –

0

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

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

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

Оказывается, что они добавили «при условии» конфигурации в 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. Я предполагаю, что у них есть другой настраиваемый плагин для синхронизации градиента со студией.

+0

Я подтверждаю, что «предоставленная» Android Gradle ** 1.0.1 ** конфигурация правильно отображается в пути к компиляции, а затем заставляет себя в APK, что побеждает цель. Многие из этих ответов очень похожи. Я использовал этот шаблон как шаблон, и он работал нормально для меня. Он хорошо работает для jar (удаленных и локальных) зависимостей, но не работает для AAR. Я закончил тем, что взрывал классы.jar из AAR в качестве обходного пути. –

11

Если вы используете плагин , providedCompile должен сделать трюк. Однако, если вам нужно исключить зависимости от включения в банку , вам придется расширить задачу jar. Ниже приведен пример для создания «жир банки» или «убер банки» (один сосуда, который включает в себя все классы своих зависимостей), за исключением depndencies отмечены 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' 
} 
+4

Это, безусловно, лучший общий/не-андроидный ответ. Очень полезно для библиотек hadoop & storm, где зависимости требуются во время компиляции, но их необходимо исключить из банки. – Nathan

2

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

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

Не работает для меня :( – Almo

5

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

Gradle latest feature: Compile only dependencies

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

В результате добавления конфигурации «compileOnly», то « compile "больше не представляет полную картину всех зависимостей времени компиляции. При необходимости ссылки на компиляцию classpath в скриптах сборки или настраиваемых плагинах вместо этого следует использовать свойство compileClasspath соответствующего исходного набора.

Смежные вопросы