Gradle:如何从WAR中排除JAR?

iso*_*tel 17 java jar war gradle

我有一个多项目Gradle构建结构,其中子项目依赖于JAR,我不想在WAR文件中.我试过"排除"但它不起作用.

主要项目脚本:

apply plugin: 'war'
war {
    dependencies {
        runtime (project(':childProject')) {
            exclude group: 'javax.servlet.jsp', module: 'jsp-api'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

childProject脚本:

apply plugin: 'java'
dependencies {
    compile 'javax.servlet.jsp:jsp-api'
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*int 23

从Gradle文档中

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

因此,换句话说,添加一个条目providedCompileprovidedRuntime将导致从war文件中排除该依赖项.

  • 使用providedCompile,如果你有依赖于某些类编译源
  • 使用providedRuntime,如果你用它来测试,而不是进行编译.

http://www.gradle.org/docs/current/userguide/war_plugin.html

providedCompile "javax.servlet:servlet-api:2.5"

  • Works:apply plugin:'war'依赖项{runtime(project(':childProject')){} providedCompile"javax.servlet.jsp:jsp-api"} (3认同)
  • 由于文件大小原因,我想从战争中排除一个 jar。不幸的是,对于使用嵌入式服务器的情况,SpringBoot(我正在使用)将 jar 移动到“WEB-INF/lib-provided”。 (2认同)

d-s*_*uer 20

我是这样做的.

war {   
    rootSpec.exclude("**/some-*.jar")
}
Run Code Online (Sandbox Code Playgroud)

  • 令人遗憾的是为什么必须使用这种黑客来完成这件事。 (2认同)

Jak*_*e W 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')
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现这对我来说是最干净的解决方案.我希望它有所帮助.