Gradle: Как исключить JAR из WAR?
У меня есть структура проекта с несколькими проектами Gradle, где дочерний проект зависит от JAR, который я не хочу быть в файле WAR. Я попробовал "исключить", но он не работает.
Основной проект script:
apply plugin: 'war'
war {
dependencies {
runtime (project(':childProject')) {
exclude group: 'javax.servlet.jsp', module: 'jsp-api'
}
}
}
Детский проект script:
apply plugin: 'java'
dependencies {
compile 'javax.servlet.jsp:jsp-api'
}
Ответы
Ответ 1
В документации Gradle
В плагин War добавлены две конфигурации зависимостей: providedCompile и providedRuntime. Эти конфигурации имеют тот же масштаб, что и соответствующие конфигурации компиляции и времени выполнения, за исключением того, что они не добавлен в архив WAR.
Иными словами, добавление записи в providedCompile
или providedRuntime
приведет к исключению этой зависимости из военного файла.
- используйте
providedCompile
, если у вас есть источник, который полагается на некоторые классы для компиляции
- используйте
providedRuntime
, если вы используете его для тестирования, а не для компиляции.
http://www.gradle.org/docs/current/userguide/war_plugin.html
Пример
providedCompile "javax.servlet:servlet-api:2.5"
Ответ 2
Я делаю это так.
war {
rootSpec.exclude("**/some-*.jar")
}
Ответ 3
Я понял, что еслиCompile иногда вводит проблемы с зависимостями для меня, например. некоторые классы не найдены. Затем я выяснил более гибкое решение.
Мы можем просто настроить требуемые зависимости как "компилировать", а затем исключить конкретные банки из военного файла, используя следующую конфигурацию войны:
war {
classpath = classpath.filter { file ->
println file.name
(
!file.name.startsWith('gwt-dev') &&
!file.name.startsWith('gwt-user') &&
!file.name.startsWith('guava-gwt') &&
!file.name.startsWith('gwtbootstrap3') &&
!file.name.startsWith('gwtbootstrap3-extras') &&
!file.name.startsWith('servlet-api')
)
}
}
До сих пор я нашел, что это самое чистое решение для меня. Надеюсь, это поможет.
Ответ 4
У меня была та же проблема, но я нашел общее решение, основанное на Jake W.
В вашем дочернем проекте, без плагина войны, вы добавляете свой собственный предоставленный компилятор и предоставляете Runtime следующим образом:
configurations {
providedCompile
providedRuntime.extendsFrom providedCompile
}
plugins.withType(JavaPlugin) {
configurations {
compile.extendsFrom providedCompile
runtime.extendsFrom providedRuntime
}
}
В проекте с вашим военным файлом вы копируете его в любом месте:
configurations.runtime.allDependencies.withType(ProjectDependency) { ProjectDependency dep ->
Project proj = dep.dependencyProject
evaluationDependsOn(proj.path)
Configuration cfg = proj.configurations.findByName('providedRuntime')
if (cfg != null){
war {
classpath -= cfg
}
}
}