Java 格雷德尔:如何将JAR排除在战争之外?

Java 格雷德尔:如何将JAR排除在战争之外?,java,jar,gradle,war,Java,Jar,Gradle,War,我有一个多项目的Gradle构建结构,其中子项目依赖于一个JAR,我不想在WAR文件中。我尝试了“排除”,但不起作用 主要项目脚本: apply plugin: 'war' war { dependencies { runtime (project(':childProject')) { exclude group: 'javax.servlet.jsp', module: 'jsp-api' } } } apply pl

我有一个多项目的Gradle构建结构,其中子项目依赖于一个JAR,我不想在WAR文件中。我尝试了“排除”,但不起作用

主要项目脚本:

apply plugin: 'war'
war {
    dependencies {
        runtime (project(':childProject')) {
            exclude group: 'javax.servlet.jsp', module: 'jsp-api'
        }
    }
}
apply plugin: 'java'
dependencies {
    compile 'javax.servlet.jsp:jsp-api'
}
项目脚本:

apply plugin: 'war'
war {
    dependencies {
        runtime (project(':childProject')) {
            exclude group: 'javax.servlet.jsp', module: 'jsp-api'
        }
    }
}
apply plugin: 'java'
dependencies {
    compile 'javax.servlet.jsp:jsp-api'
}

来自Gradle文档

War插件添加了两个依赖项配置:providedCompile和providedCompile 提供运行时。这些配置的作用域与 各自的编译和运行时配置,除了 没有添加到战争档案中

因此,换句话说,
providedCompile
providedRuntime
添加条目将导致从war文件中排除该依赖项。

  • 如果您的源代码依赖于某些类进行编译,请使用
    providedCompile
  • 如果您将它用于测试而不是编译,请使用
    providedRuntime

示例


providedCompile“javax.servlet:servlet api:2.5”

我意识到providedCompile有时会给我带来依赖性问题,例如一些类找不到。然后我想出了一个更灵活的解决方案

我们只需将所需的依赖项配置为“编译”,然后使用以下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')
        )
    }
}
到目前为止,我发现这是对我来说最干净的解决方案。我希望能有帮助。

我就是这样做的

war {   
    rootSpec.exclude("**/some-*.jar")
}

我也有同样的问题,但我找到了一个基于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
    }
  }
}

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
}

我认为项目依赖项不支持排除。(参见John的答案以获得有效的解决方案。)
依赖项
块是顶级元素,不应嵌套在
war
中。工作:应用插件:'war'依赖项{runtime(project(':childProject')){}providedCompile“javax.servlet.jsp:jsp api”}由于文件大小的原因,我想将jar从war中排除。SpringBoot(我正在使用)不幸地将JAR移动到
WEB-INF/lib-provided
,以便使用嵌入式服务器。这对我不起作用,但当我将作用域改为“provided”而不是“providedComile/Runtime”时,它就起作用了。我喜欢,但这个对我来说过滤掉了那个jar的所有值——我只想删除重复项。提供了一个只排除重复项的类似解决方案,我想您需要在其中编写一些自定义逻辑来删除重复项。正如你所看到的,我们可以打印所有的文件名YUP,完成了它并按照我的意愿工作,但你的工作让我走上了正确的轨道来解决它,这是一个奇怪的情况,它只是一个暂时的问题,直到其他工件被放入maven,而不是仅仅放入lib dir。令人遗憾的是,为什么要使用这种黑客来完成这项工作。