Gradle:如何从WAR中排除JAR?

时间:2013-12-20 16:04:44

标签: java jar gradle war

我有一个多项目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'
}

5 个答案:

答案 0 :(得分:23)

来自Gradle文档

  

War插件添加了两个依赖配置:providedCompile和   providedRuntime。这些配置的范围与   相应的编译和运行时配置,除了它们   没有添加到WAR档案中。

因此,换句话说,providedCompileprovidedRuntime添加条目会导致从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
}