при условии компиляции без плагина войны

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

Для сборки я использую Gradle 1.3 и следующий build.gradle файл:

apply plugin: 'java'

dependencies {

    compile group:'org.slf4j', name:'slf4j-api', version:'1.7.+'

    testCompile group:'junit', name:'junit', version:'4.+'

    compile group:'org.springframework', name:'spring-web', version:'3.+'   

    compile group:'org.slf4j', name:'slf4j-log4j12', version:'1.6.+'
    compile group:'log4j', name:'log4j', version:'1.2.+'

    providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+'        

}

repositories {

    mavenCentral()

}

Как видите, мне нужен api сервлета для успешной компиляции этого фильтра, поэтому я хочу добавить его как зависимость, предоставленную maven.

В любом случае, после запуска gradle build я получаю следующую ошибку:

Не удалось найти метод providedCompile () для аргументов [{group = javax.servlet, name = javax.servlet-api, version = 3. +}] в корневом проекте 'hibernate-talk-context'.

Теперь я знаю, что не могу использовать providedCompile без плагина WAR, но мне нужно, чтобы проект был простым JAR. Есть другой способ сделать это?


person ElderMael    schedule 18.12.2012    source источник
comment
Возможный дубликат Как определить компиляцию- time * only * путь к классам в Gradle?   -  person Nick Grealy    schedule 23.08.2016


Ответы (7)


Для плагина java нет такой конфигурации "из коробки". Однако вы можете построить его самостоятельно следующим образом:

configurations { providedCompile }

dependencies {
    providedCompile "javax.servlet:javax.servlet-api:3.+"
}

sourceSets.main.compileClasspath += configurations.providedCompile
sourceSets.test.compileClasspath += configurations.providedCompile
sourceSets.test.runtimeClasspath += configurations.providedCompile

Это добавляет конфигурацию и помещает все зависимости туда на пути к классам компиляции как ваших основных классов, так и тестовых классов. Вам также необходимо добавить его в runtimeClasspath, поскольку он не включает путь к классам компиляции в соответствии с документацией gradle DSL.

person Hiery Nomus    schedule 18.12.2012
comment
Просто предупреждение людям, что это решение несовместимо с Eclipse. Ответ dty показывает способ заставить его работать там. В основном, просто добавив: eclipse.classpath.plusConfigurations + = configurations.providedCompile в файл сборки. - person IcedDante; 29.08.2014
comment
Решение, которое работает как в Eclipse, так и в IntelliJ, см. Здесь: stackoverflow.com/a/25809968/2591231 - person Doron Gold; 12.09.2014
comment
Все усложняется, когда мы хотим добавить поддержку плагина идей. Gradle 2.x построен на основе Groovy 2.3, который не поддерживает добавление одного элемента в коллекцию с помощью + =. Это может привести к сбою. Невозможно изменить конфигурацию ": при условии" после ее устранения. Использование + = в ответе нормально, но если у вас есть эта ошибка, вам может потребоваться обернуть правую часть после + = с помощью []. См. Это обсуждение: Discussion.gradle.org/t/ - person virgo47; 13.05.2015
comment
Я отправил запрос функции, обсудить.gradle.org/t/ need-providecompile-for-java-plugin / 10457, чтобы добавить providedCompile для подключаемого модуля java. - person djb; 06.07.2015
comment
Кажется, это нарушает {@link } ссылки javadoc - person Gus; 23.03.2017
comment
К сожалению, если вы позже добавите военную задачу с соответствующим плагином, она вызовет ошибку. Невозможно добавить конфигурацию с именем «providedCompile», поскольку конфигурация с таким именем уже существует. - person Meower68; 14.07.2017

Взгляните на подключаемый модуль Gradle propdeps от SpringSource. Из описания проекта:

Предоставляет дополнительные необязательные и предоставленные конфигурации зависимостей для Gradle вместе с поддержкой создания Maven POM.

person Gerhard Schlager    schedule 04.01.2013
comment
Спасибо за указатель, пример со страницы SpringSource решил эту проблему для меня. Я думаю, что это странно, что Gradle не имеет понятия «из коробки». - person Spanky Quigman; 20.09.2013
comment
Это простое решение, но я считаю, что оно по-прежнему приводит к тому, что предоставленные JAR-файлы упаковываются в мою WAR, чего я не ожидал. - person Nick Spacek; 15.01.2016

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

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}
person Doron Gold    schedule 27.10.2016
comment
На мой взгляд, у compileOnly немного другая семантика. providedCompile предполагает, что сервер приложений предоставит его, тогда как compileOnly предполагает, что пакет нужен только во время компиляции (например, аннотации Lombok), а не во время выполнения. - person Nick Spacek; 14.03.2018

Недавно я написал сообщение в блоге, в котором описывается именно этот сценарий. Он также показывает, как правильно настроить интеграцию с Eclipse.

http://blog.codeaholics.org/2012/emulating-mavens-provided-scope-in-gradle/

person dty    schedule 18.12.2012

Когда вы обнаружите, что используете Gradle 2.12, измените «providedCompile» на «compileOnly».

person ginzsa    schedule 18.03.2016

Есть способ попроще:

configurations {    
    provided
    provided.extendsFrom(compile)
}

и тогда вы можете:

dependencies {  
    provided group: 'javax.servlet', name: 'javax.servlet-api', version:'3.+' 
}

Вы также захотите иметь предоставленные библиотеки в сгенерированных файлах проекта Eclipse или Idea:

idea.module.scopes.PROVIDED.plus += configurations.provided
eclipse.classpath.plusConfigurations += configurations.provided
person Dima Gutzeit    schedule 17.07.2013
comment
Я не смог заставить это работать без дополнений sourceSets. Что я делаю неправильно? Тем не менее, спасибо за исправление IDEA. - person stolsvik; 17.07.2015
comment
Кроме того, исправлениям Eclipse и IntelliJ теперь нужны квадратные скобки, например: eclipse.classpath.plusConfigurations += [ configurations.provided ] - person stolsvik; 18.07.2015

Чтобы заставить javadoc работать, мне пришлось добавить это:

javadoc.classpath=sourceSets.main.compileClasspath
person Peter Borbas    schedule 10.09.2013
comment
После принятого выше ответа в файле build.gradle. Спасибо. - person Snicolas; 02.09.2015