Spring Boot中jar和war的区别?

Posted

技术标签:

【中文标题】Spring Boot中jar和war的区别?【英文标题】:Differences between jar and war in Spring Boot? 【发布时间】:2017-12-23 05:48:11 【问题描述】:

我即将使用 Spring Boot 使用 Spring Framework 在 Java 中构建我的第一个网站,在 jar 中构建它要容易得多,但我有几个问题。

一般有什么区别?

jar 文件中,视图位于/resources/templates 下,但在war 文件中,它位于/webapp/WEB-INF/ 下。

有什么区别?我可以在在线主机上部署jar 吗?

【问题讨论】:

【参考方案1】:

可以告诉 Spring Boot 生成一个“胖 JAR”,其中包含所有模块/服务的依赖项,并且可以使用 java -jar <your jar> 运行。请参阅“使用 Maven 创建可执行 JAR”here。

Spring Boot 也可以告诉produce a WAR file,在这种情况下,您可能会选择将其部署到 Web 容器,例如 Tomcat 或 Jetty。

更多关于 Spring Boot 部署的详细信息here。

【讨论】:

在这种情况下不要忘记排除嵌入式tomcat;检查@lazyneuron 答案中的链接 @HamaSaadwn 仅供参考,以war 构建的spring-boot 应用程序也可以以java -jar xxx.war 运行。当您通过移动到 fat jar 对部署基础架构进行更改时,可以在某些过渡阶段使用它 它是否“胖”(即包含所有依赖项)和可执行文件,不取决于它是 .jar 文件还是 .war 文件。这个当前接受的答案并不能解释两者之间的区别(这是所要求的)。 有什么区别?你没有回答问题!!! 真正的问题从未得到解答?我认为最初的问题是关于差异......【参考方案2】:

取决于您的部署。如果您计划将应用程序部署到现有的 Java EE 应用程序服务器(例如 Tomcat),那么标准方法是执行 war 构建。

当您使用fat jar 方式时,您的应用程序将部署在spring boot 提供的嵌入式应用程序容器上。进行Deploying Spring Boot Applications 了解更多信息。

【讨论】:

这是所有问题的正确答案(说明差异)。 您也可以创建一个可执行的war文件,在这种情况下,它的工作方式与jar相同,但具有war布局。所以这并不是两者之间的真正区别。 为什么一个人会选择部署在外部服务器上?这是否意味着失去了 sprint boot 的美感,它本来应该自动初始化服务器..【参考方案3】:

以胖*.jar 运行spring-boot 应用程序

可以使用嵌入式应用程序容器构建所谓的fat JAR 可执行*.jar 文件(Tomcat 作为默认选项)。 有用于各种构建系统的spring-boot 插件。这是maven:spring-boot-maven-plugin

要执行fat *.jar 的那种,你可以简单地运行命令:

java -jar *.jar

或者使用spring-boot-maven目标:

mvn spring-boot:run

spring-boot 应用程序构建为*.war 存档

另一种选择是将您的应用程序作为老式的war 文件发送。它可以部署到任何 servlet 容器。这是一步一步的操作方法列表:

    packaging改成war(说说maven的pom.xml) 从SpringBootServletInitializer 继承主应用程序类spring-boot 并覆盖SpringApplicationBuilder configure(SpringApplicationBuilder) 方法(参见javadoc) 确保将spring-boot-starter-tomcatscope设置为provided

More info in spring-boot documentation

【讨论】:

相同的步骤是否适用于 gradle? @HamaSaadwn 绝对! 谢谢,但是如果是fat jar,我们如何配置tomcat?例如配置 ssl? @ashkanr 在这里查看 spring-boot 属性列表docs.spring.io/spring-boot/docs/current/reference/html/…。基本上,属性是配置嵌入式 Tomcat 实例的常用方法。【参考方案4】:

当我在本地免费部署我的 jar 问题时,我遇到了同样的问题。然后我不得不在服务器上演示它。您可以通过更改 pom.xml ,标签来创建一个war文件

<packaging>jar</packaging>

<packaging>war</packaging>

你的目标中会有一个war文件,你可以将它部署到你的服务器(在我的例子中是tomcat)

【讨论】:

【参考方案5】:

如果您需要将其部署在外部容器中,通常必须创建一个 war 文件(不必是可执行文件)。

如果要使用嵌入式容器,可以选择创建可执行的 .jar 文件或可执行的 .war 文件。 AFAIK 唯一的区别在于存档的布局,因此通常也是源存储库的布局。

例如使用 Maven / Gradle 的标准文件夹结构,.jar 的静态资源需要在 src/main/resources/static 中,而对于 .war 文件,它们应该在 src/main/webapp 中。

【讨论】:

...而对于 .war 文件,它们应该在 src/main/webapp. @HolmesQueen 很好,我已经更新了答案。【参考方案6】:

简单易行的答案。 封装类型jar 表示为独立应用程序,封装类型war 表示为Web 应用程序。

【讨论】:

【参考方案7】:

war 文件是一个 Web 应用程序存档,它在应用服务器中运行,而 .jarJava 应用程序存档,它在用户计算机上运行桌面应用程序. war 文件是一个特殊的 jar 文件,用于打包 Web 应用程序,以便将其部署到应用程序服务器上。

【讨论】:

以上是关于Spring Boot中jar和war的区别?的主要内容,如果未能解决你的问题,请参考以下文章

一个 Spring Boot 项目,部署到 JAR 或 WAR

远程Debug项目(jar包和war包)

更新 Spring Boot 以生成 WAR 文件而不是 JAR 文件

Spring Boot 构建 WAR和JAR 文件

Spring boot demo: spring boot生成war包

spring Boot2.在Myecplise上把spring Boot项目打包 war包和jar包