如何使用 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 个子焊料 classes
、resources
和 tmp
的 \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
时的日志吗?
尝试将classes
、resources
和tmp
文件夹压缩成一个.zip
文件,然后将其重命名为.war
文件
【参考方案1】:
我猜你除了war插件之外,还把spring boot gradle插件应用到了你的项目中?那么这种行为是正常的,因为 Spring Boot 插件将禁用 jar 和 war 任务并将它们替换为 bootWar 和 bootJar 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 1.12 版发布(部署)本地(.war .jar)文件到 Artifactory?