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-tomcat
的scope
设置为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 应用程序存档,它在应用服务器中运行,而 .jar
是 Java 应用程序存档,它在用户计算机上运行桌面应用程序. war 文件是一个特殊的 jar 文件,用于打包 Web 应用程序,以便将其部署到应用程序服务器上。
【讨论】:
以上是关于Spring Boot中jar和war的区别?的主要内容,如果未能解决你的问题,请参考以下文章
一个 Spring Boot 项目,部署到 JAR 或 WAR
更新 Spring Boot 以生成 WAR 文件而不是 JAR 文件