Подтвердить что ты не робот

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

Ответ 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
    }
  }
}