我有一个多项目Gradle构建结构,其中子项目依赖于JAR,我不想在WAR文件中。我试过“排除”但它不起作用。
主要项目脚本:
apply plugin: 'war'
war {
dependencies {
runtime (project(':childProject')) {
exclude group: 'javax.servlet.jsp', module: 'jsp-api'
}
}
}
childProject脚本:
apply plugin: 'java'
dependencies {
compile 'javax.servlet.jsp:jsp-api'
}
答案 0 :(得分:23)
来自Gradle文档
War插件添加了两个依赖配置:providedCompile和 providedRuntime。这些配置的范围与 相应的编译和运行时配置,除了它们 没有添加到WAR档案中。
因此,换句话说,向providedCompile
或providedRuntime
添加条目会导致从war文件中排除该依赖项。
providedCompile
providedRuntime
进行测试而不是编译,请使用providedCompile "javax.servlet:servlet-api:2.5"
。http://www.gradle.org/docs/current/userguide/war_plugin.html
示例强>
{{1}}
答案 1 :(得分:18)
我这样做。
war {
rootSpec.exclude("**/some-*.jar")
}
答案 2 :(得分:5)
我意识到provideCompile有时会为我引入依赖项问题,例如:找不到一些课程。然后我想出了一个更灵活的解决方案。
我们可以将所需的依赖项配置为“compile”,然后使用以下war配置从war文件中排除特定的jar:
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')
)
}
}
到目前为止,我发现这对我来说是最干净的解决方案。我希望它有所帮助。
答案 3 :(得分:4)
我遇到了同样的问题,但我找到了一个基于Jake W的通用解决方案。
在你的子项目中,没有war插件,你可以像这样添加你自己的providedCompile和providedRuntime:
configurations {
providedCompile
providedRuntime.extendsFrom providedCompile
}
plugins.withId('java') {
configurations {
compile.extendsFrom providedCompile
runtime.extendsFrom providedRuntime
}
}
在包含war文件的项目中,您可以将其复制到任意位置:
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
}
}
}
答案 4 :(得分:0)
War 任务的默认行为是将 src/main/webapp 的内容复制到存档的根目录。你的webapp目录当然可能包含一个WEB-INF子目录,里面可能包含运行时[1]配置到WEB-INF/lib的所有依赖。
因此,为了避免加载其他 jar 文件或减小 war 文件的大小,您可能需要在打包期间排除 jar。因此,尝试添加 rootSpec.exclude("/*.jar")** 以排除 war 文件中的 jar,如下所示。
war {
archiveName = "newproject.war"
rootSpec.exclude("**/*.jar")
destinationDir = buildDir
}