Как определить путь classа компиляции * только * в Gradle?

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

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

Я вспахал документацию с раздутым gradleиентом, но не могу найти никаких четких инструкций или примеров. Я подозреваю, что это может быть достигнуто путем определения «конфигурации» и установки его как пути к classам плагина 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 , что providedCompile должна сделать трюк. Однако, если вам нужно исключить зависимости от включения в банку , вам придется расширить задачу jar . Ниже приведен пример построения «толстой банки» или «uber jar» (единственной банки, содержащей все classы ее зависимостей), за исключением отмеченных отметок:

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

Я понял это для моей настройки проекта. Я использую Android Studio, работающую с плагином gradle 0.9. + С gradleиентом 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 } 

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

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

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

  • Внешние зависимости для скрипта сборки
  • Объявление пути classа для пользовательской задачи Ant

Если вы используете плагин 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" } 

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

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

Помните об одном важном побочном эффекте:

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

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

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

В студии Android мне пришлось обновить до версии 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

В Android Studio 1.0 выполните следующее:

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

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

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

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

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

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

 dependencies { provided "groupId:artifcatId:version" } 
  • Какова цель настройки «Предпочитаю 32-бит» в Visual Studio 2012 и как она работает?
  • Как скомпилировать Qt 5 под Windows или Linux, 32 или 64 бит, статические или динамические на VS2010, VS2012, VS2013 или VS2015 Express или g ++
  • Как скомпилировать приложение Python 3 в .exe?
  • Как компилировать .java с поддержкой более старых версий Java?
  • Сохранение имен параметров / аргументов в скомпилированных java-classах
  • Неопределенная ссылка на «initscr» Ncurses
  • Профилирование процесса компиляции C ++
  • Почему JVM-кеш JIT-скомпилированный код?
  • «% d» ожидает аргумент типа «int», но аргумент 2 имеет тип «long unsigned int»
  • Как скомпилировать приложение .NET в собственный код?
  • Как перекомпилировать с -fPIC
  • Interesting Posts

    Как сериализовать словарь как часть его родительского объекта с помощью Json.Net

    Как извлечь 7z zip и иметь правильную структуру директории?

    Как узнать, является ли мой ключ продукта Windows 7 Professional оригинальным?

    Ошибка TypeScript в коде Angular2: не удается найти имя ‘module’

    Не удается переустановить Mac os x 10.10

    Мои изображения размыты! Почему WPF SnapsToDevicePixels не работает?

    Ошибка входа в API Facebook с использованием FB-приложения, установленного на телефоне

    Как удалить символическую ссылку?

    В каком окружении Конда работает Jupyter?

    Список хранимых процедур / функций Командная строка Mysql

    Наследование backbone.js

    Как создать WPat Datagrid с неизвестным количеством столбцов

    Текстовый поиск MongoDB и несколько поисковых слов

    Результат Struts2 INPUT: как он работает? Как обрабатываются ошибки преобразования / проверки?

    Могут ли macros быть перегружены по количеству аргументов?

    Давайте будем гением компьютера.