Как определить путь classа компиляции * только * в Gradle?
Может кто-нибудь, пожалуйста, дайте мне простой пример build.gradle того, как я могу указать classы времени компиляции, которые не включены в развертывание во время выполнения (война).
Кажется, что Gradle получил это неправильно, так как «runtime» наследует «компиляцию». Я не могу представить ситуацию, когда я бы хотел, чтобы classы во время выполнения не захотели во время компиляции. Тем не менее, есть много обстоятельств, когда мне нужны classы для генерации кода во время компиляции, которые я не хочу развертывать во время выполнения!
Я вспахал документацию с раздутым gradleиентом, но не могу найти никаких четких инструкций или примеров. Я подозреваю, что это может быть достигнуто путем определения «конфигурации» и установки его как пути к classам плагина CompileJava, но документация не подходит для объяснения того, как этого добиться.
- Как заставить Visual Studio использовать встроенную привязку amd64
- В чем разница между «Включить каталоги» и «Дополнительные каталоги Include»,
- Как определить версию приложения в одном месте для нескольких приложений?
- Статические конечные значения Java заменяются в коде при компиляции?
- Перекрестная компиляция Перейти на OSX?
- Scala double definition (2 метода имеют стирание того же типа)
- Как показать консольный вывод / окно в приложении форм?
- Почему Swift компилируется так медленно?
- Почему я получаю ошибку компиляции «org / codehaus / groovy / control / CompilationFailedException»?
- C ++, объявление переменной в выражении 'if'
- #ifdef #ifndef в Java
- Очень медленное время компиляции на Visual Studio 2005
- Почему вы должны связать математическую библиотеку с C?
Было много дискуссий по этой теме, главным образом здесь , но не ясный вывод.
Вы на правильном пути: в настоящее время лучшим решением является объявить вашу собственную 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" }