如何使用 gradle 构建 WAR 文件?

Posted

技术标签:

【中文标题】如何使用 gradle 构建 WAR 文件?【英文标题】:How to build a WAR file with gradle? 【发布时间】:2019-02-18 05:55:42 【问题描述】:

我想构建一个 WAR 文件(然后将其部署到 Tomcat)。因此,作为练习,我在 IDEA IntelliJ 中使用 Gradle 启动了一个新的 Spring Boot 项目。之后,我在build.gradle 文件中应用了插件,就像这样apply plugin: 'war' .

问题是当我尝试在终端中运行gradle war 时,我没有得到war 文件!唯一发生的事情是它将生成一个带有 3 个子焊料 classesresourcestmp\build,但其中没有 WAR。

我应该怎么做才能获得 WAR 文件?我看过this 的视频,但是这个人使用 Maven,不做高级的东西并且得到了战争。我认为必须有一种方法让它保持简单。

当我运行gradle war --info

Initialized native services in: C:\Users\...\.gradle\native The client 

...

任务:编译Java UP-TO-DATE 解决项目“deleteme”的全局依赖管理 排除 [org.apache.tomcat:tomcat-annotations-api] 不包括 [] 跳过任务 ':compileJava',因为它是最新的。 :compileJava (Thread[Task worker for ':',5,main]) 完成。耗时 0.753 秒。 :processResources (Thread[Task worker for ':',5,main]) 已启动。

任务:processResources UP-TO-DATE 跳过任务“:processResources”,因为它是最新的。 :processResources (Thread[Task worker for ':',5,main]) 完成。耗时 0.003 秒。 :classes (Thread[Task worker for ':',5,main]) 已启动。

Task :classes UP-TO-DATE 跳过任务 ':classes' 因为它没有动作。 :classes (Thread[Task worker for ':',5,main]) 完成。耗时 0.0 秒。 :war (Thread[Task worker for ':',5,main]) 已启动。

任务:战争已跳过 将任务 ':war' 作为任务 onlyIf 跳过是假的。 :war (Thread[Task worker for ':',5,main]) 完成。耗时 0.0 秒。

【问题讨论】:

gradle war 应该在/build/libs 目录中生成战争 我知道,但它不存在。你能试试看这是否适合你? 可以在终端上分享运行gradle war时的日志吗? 尝试将classesresourcestmp 文件夹压缩成一个.zip 文件,然后将其重命名为.war 文件 【参考方案1】:

我猜你除了war插件之外,还把spring boot gradle插件应用到了你的项目中?那么这种行为是正常的,因为 Spring Boot 插件将禁用 jarwar 任务并将它们替换为 bootWarbootJar em> 任务。

同时应用了 spring boot 和 war 插件:

./gradlew war
15:35:09: Executing task 'war'...

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :war SKIPPED

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 up-to-date
15:35:10: Task execution finished 'war'.

注意 SKIPPED 消息

$ ./gradlew bootWar
15:36:35: Executing task 'bootWar'...

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootWar

BUILD SUCCESSFUL in 1s
3 actionable tasks: 1 executed, 2 up-to-date
15:36:37: Task execution finished 'bootWar'.

然后你会在build/libs下得到预期的war文件。

您仍然可以按照此处的说明重新启用标准 jar/war 任务:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/html/#packaging-executable-wars-deployable(如果您需要生成普通存档而不是可执行存档)

关于 Tomcat 问题:安装 Tomcat 8.5。

【讨论】:

我应该修改什么来获得 WAR? 你需要调用'bootWar'任务,我已经编辑了我的答案。 实际上这取决于您要生成什么样的存档:如果您需要可执行的 jar/war,只需使用 spring boot 任务 bootWar/bootJar。如果您想要一个正常的存档,那么您可以启用 jar/war 任务,如下所述:docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/… 我有一个不包括闭包 warenabled=true 的 WAR,但它无法部署到 Tomcat。如果我尝试添加它给我的闭包: > 无法在 org.gradle.api.Project 类型的根项目“删除我”上找到参数 [build_20hpmyk1gg89gy3gwioursjxu$_run_closure1@117145] 的方法 war()。 我认为这个链接可以帮助你:codebyamir.com/blog/how-to-deploy-spring-boot-war-to-tomcat。如果需要将战争部署到 Tomcat,则需要生成“正常”可部署战争,而不是“可执行”(启动)战争。因此,您需要使用 *war enable=true" 启用战争任务(这需要您应用战争插件: *apply plugin 'war: "【参考方案2】:

正如@M.Ricciuti 所说,spring boot gradle 插件将禁用jar/war 任务,并且仅适用于bootJar/bootWar 任务。但是,如果您仍然希望您的项目与 jar/war 任务一起打包,只需将以下内容添加到您的 build.gradle 文件中

war 
    enabled=true

这将使gradle war 命令能够为您的项目生成战争。

【讨论】:

【参考方案3】:

请阅读:https://docs.gradle.org/current/userguide/war_plugin.html

如果在 IntelliJ 中使用 Gradle,请转到 build.gradle(或对于 Kotlin 的 build.gradle.kts)并添加

id '战争'

(或只是

战争

对于 Kotlin ) 在插件下

重新加载 Gradle 项目,然后在 Intellij 终端上使用 gradlew bootWar。

添加 --info 或 --stackTrace 进行调试

【讨论】:

【参考方案4】:

我也遇到了同样的问题。

经过一番挣扎,我发现我需要在我的应用程序中扩展SpringBootServletInitializer。所以我的有效代码看起来像

    public class SyncApplication extends SpringBootServletInitializer 

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(SyncApplication.class);
    

    public static void main(String[] args) 
        SpringApplication.run(SyncApplication.class, args);
    



看起来像这样SpringBootServletInitializer 指示战争插件在构建战争时生成引导代码,因此在部署应用程序时初始化弹簧上下文。

【讨论】:

以上是关于如何使用 gradle 构建 WAR 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 如何配置构建文件以从同一项目创建 Spring boot jar 和 spring web-mvc war

Gradle使用不同的属性文件构建多个.war文件[关闭]

如何使用 Gradle 1.12 版发布(部署)本地(.war .jar)文件到 Artifactory?

SpringBoot使用Gradle构建war包

如何使 gradle processResources 任务更快

Gradle 与 AGP 构建 API: 配置您的构建文件