【问题标题】:Gradle include jar produced by another project in warGradle包含战争中另一个项目产生的jar
【发布时间】:2017-02-12 02:46:14
【问题描述】:

目前我有两个带有 gradle build.gradle 的项目。首先是要创建一个胖 jar 文件,我想将它包含在一个 war 文件中。我认为编译它就足够了,但它似乎并没有出现在我的 war 文件的 /lib 目录中。任何人都认为我对 gradle 很陌生。

dependencies {
    compile project(':JarProject')
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    providedCompile 'org.apache.tomcat:tomcat-jsp-api:7.0.55'

}


war {
    archiveName 'WarProject.war'
    from 'JarProject/build/libs'
    webXml = file('src/web.xml')
}

第二次项目战是否需要在providedRuntime中?或者我应该在本地 maven 存储库中发布来自其他项目的 jar 并以这种方式包含它?

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

    War 任务就其在战争中打包的内容而言本质上类似于 CopyTask,因此documentation on working with files 很有用。本质上,我认为您需要类似(未经测试):

    from fileTree('JarProject/build/libs') {
        into("lib")
    }
    

    话虽如此,使用mavenLocal() 并在那里发布也可以,但是当战争包括本地的一些旧版本时,它可能会导致意想不到的结果,像上面那样从文件系统中显式获取 jar 会更好。

    我认为优雅的解决方案是使用multi project buildsproject level dependencies。您可以将两个构建作为同一个 Gradle 构建的单独项目,并将“jar 项目”添加为常规的 compile 依赖项。

    【讨论】:

    • 感谢您的评论,我目前正在使用多项目构建。将“来自configurations.runtime”添加到war 文件创建确实从其他项目中删除了jar。但是,它还将所有依赖项与 web-inf/lib 一起放在根 war 目录中
    • 您仍然需要into "web-inf/lib" 将它们放在其他地方,战争的根源是默认的。我刚刚意识到您的初始示例具有JarProject 的编译时间依赖性,因此它应该将其包含在战争中,而无需您付出更多努力。您可能需要从您的项目和 gradle 脚本中提供更多信息,以便能够分辨出缺少的内容。我能找到的唯一常见原因是this answer
    【解决方案2】:

    你是如何声明依赖的?我假设您有一个包含子项目 A 和 B 的多项目构建,两者都使用 War 插件。我使用 Gradle 2.4 做了一个实验,如果我像这样声明 B/build.gradle:

    apply plugin: 'war'
    
    dependencies {
        compile project(':A')
    }
    

    然后 B.war 包含 WEB-INF/lib/A.jar。如果您正确遵循 Gradle War 插件的约定(将 Web 资源放在 A/src/main/webapp/ 中,将代码相关资源放在 A/src/main/resources/ 中),那么 A.jar 应该包含您想要的内容。

    this

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 2015-09-19
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      相关资源
      最近更新 更多