Gradle "Предоставленная" зависимость для Java-плагина

Я пытаюсь скомпилировать несколько файлов WAR, все, что зависит от общего модуля JAR. Однако в моей компоновке Gradle я не могу заставить зависимую функцию "Предоставлено" работать с плагином Java.

Моя компиляция выглядит так:

apply plugin: 'java'
configurations{
    providedCompile
}

dependencies {
    compile module("org.springframework.amqp:spring-amqp:${springAmqpVersion}")
    compile module("org.slf4j:slf4j-api:${slf4jVersion}")
    compile module("org.slf4j:slf4j-ext:${slf4jVersion}")

    providedCompile "javax.servlet:servlet-api:${servletApiVersion}"

    runtime module("org.slf4j:jcl-over-slf4j:${slf4jVersion}")
    runtime module("org.slf4j:jul-to-slf4j:${slf4jVersion}")
    runtime module("org.slf4j:log4j-over-slf4j:${slf4jVersion}")

    sourceArchives module("org.springframework.amqp:spring-amqp:${springAmqpVersion}:sources")
    sourceArchives module("javax.servlet:servlet-api:${servletApiVersion}:sources")
}


sourceSets {
    main { compileClasspath += configurations.providedCompile }
}

Однако этот последний бит - это то место, где он получает исключение. Я попытался добавить servlet-api (предоставленный Tomcat) в конфигурацию после того, как зависимости от выполнения будут расширять его или просто поместить в модуль компиляции, а затем удалить из зависимостей времени выполнения позже.

Я попытался несколько разных способов изменения зависимостей, мои самые близкие результаты:

newRuntime = configurations.runtime.minus(configurations.providedCompile)
configurations.runtime = newRuntime

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

Я нашел много обсуждений этой точной проблемы в отслеживании ошибок Gradle: Gradle-784

Однако основной причиной этого является Spring, который использует Maven с их строками Gradle, с которыми я не знаком.

Самая многообещающая ссылка, которую я нашел здесь на SO, но, к сожалению, я не смог заставить примеры работать: SO предоставленный вопрос Обратите внимание на вопрос о переполнении стека, который показал наибольшую перспективу:

//Include provided for compilation
sourceSets.main.compileClasspath += configurations.provided

Эта строка не дает ошибки, как и другие попытки, однако, похоже, что предоставленная предоставленная компиляция (моя версия предоставлена) на самом деле не помещается в путь класса компиляции, так как при попытке компиляции существует ошибка класса.

Ответ 1

Я не на 100% слежу за вашим сообщением, но при условии, что компиляция разрешена только для плагина "war".

apply plugin: 'war'

dependencies {
  // others go here
  providedCompile "javax.servlet:javax.servlet-api:${servletVersion}"
}

Во время "войны" барабан сервлета не включается.

Ответ 2

Вы добавили конфигурацию providedCompile, но вы ничего не делаете с ней. Следовательно, это не будет происходить на любом пути класса. Чтобы поместить конфигурацию в основной путь к компиляции, вы можете сделать:

sourceSets.main.compileClasspath += configurations.providedCompile

Аналогично, чтобы поставить его на путь класса компиляции теста:

sourceSets.test.compileClasspath += configurations.providedCompile

Ответ 3

Вы можете использовать область скомпилировать внутри 'jar' модулей и предоставленоCompile внутри 'war' модуля.

War предоставленКомпилировать область переопределит область jar скомпилировать.