SpringBoot项目打成war和jar的区别「建议收藏」

SpringBoot项目打成war和jar的区别「建议收藏」首先给大家来讲一个我们遇到的一个奇怪的问题:1.我的一个springboot项目,用mvninstall打包成jar,换一台有jdk的机器就直接可以用java-jar项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了?2.然后我打包成war放进tomcat运行,发现端口号变成tomcat默认的8080(我在server.port中设置端口8090)项目名称也…

大家好,又见面了,我是你们的朋友全栈君。

首先给大家来讲一个我们遇到的一个奇怪的问题:

1.我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了?
2.然后我打包成war放进tomcat运行,发现端口号变成tomcat默认的8080(我在server.port中设置端口8090)项目名称也必须加上了。
也就是说我在原来的机器的IDEA中运行,项目接口地址为 ip:8090/listall,打包放进另一台机器的tomcat就变成了ip:8080/项目名/listall。这又是为什么呢?

通过jar运行实际上是启动了内置的tomcat,所以用的是应用的配置文件中的端口
直接部署到tomcat之后,内置的tomcat就不会启用,所以相关配置就以安装的tomcat为准,与应用的配置文件就没有关系了

哎,现在学编程的基本都不会教历史了,也没人有兴趣去钻研。总体来说吧,很多年前,Sun 还在世的那个年代,在度过了早期用 C++写 Html 解析器的蛮荒时期后,有一批最早的脚本程序进入了 cgi 时代,此时的 Sun 决定进军这个领域,为了以示区别并显得自己高大上,于是研发了 servlet 标准,搞出了最早的 jsp。并给自己起了个高大上的称号 JavaEE ( Java 企业级应用标准,我呸,不就是一堆服务器以 http 提供服务吗,吹逼)。既然是企业级标准那自然得有自己的服务器标准。于是 Servlet 标准诞生,以此标准实现的服务器称为 Servle 容器服务器,Tomcat 就是其中代表,被 Sun 捐献给了 Apache 基金会,那个时候的 Web 服务器还是个高大上的概念,当时的 Java Web 程序的标准就是 War 包(其实就是个 Zip 包),这就是 War 包的由来。后来随着服务器领域的屡次进化,人们发现我们为什么要这么笨重的 Web 服务器,还要实现一大堆 Servlet 之外的管理功能,简化一下抽出核心概念 servlet 不是更好吗,最早这么干的似乎是 Jetty,出现了可以内嵌的 Servelet 服务器。去掉了一大堆非核心功能。后来 tomcat 也跟进了,再后来,本来很笨重的传统 JavaEE 服务器 Jboss 也搞了个 undertow 来凑热闹。正好这个时候微服务的概念兴起,“ use Jar,not War ”。要求淘汰传统 Servlet 服务器的呼声就起来了。

jar包和war包的区别:

1、war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块;jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的。

2、war包是做好一个web应用后,通常是网站,打成包部署到容器中;jar包通常是开发时要引用通用类,打成包便于存放管理。

3、war是Sun提出的一种Web应用程序格式,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织;classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)可以打包成jar放到WEB-INF下的lib目录下。

JAR文件格式以流行的ZIP文件格式为基础。与ZIP文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。

【格式特点】:

  1. 安全性 可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。

  2. 减少下载时间 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。

  3. 压缩:JAR 格式允许您压缩文件以提高存储效率。

  4. 传输平台扩展:Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。

WAR文件:就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个war扩展名。

【建立的条件】:

  1. 需要建立正确的Web应用程序的目录层次结构。

  2. 建立WEB-INF子目录,并在该目录下建立classes与lib两个子目录。

  3. 将Servlet类文件放到WEB-INF\classes目录下,将Web应用程序所使用Java类库文件(即JAR文件)放到WEB-INF\lib目录下。

  4. 将JSP页面或静态HTML页面放到上下文根路径下或其子目录下。

  5. 建立META-INF目录,并在该目录下建立context.xml文件。

下面给大家讲讲怎么将springboot项目打包成jar和war

SpringBoot项目打包成jar很简单,也是SpringBoot的常用打包格式;本篇博客将SpringBoot打包成jar和war两种方式都记录下来; 
先介绍将SpringBoot打包成jar包的方式:(以下示例是在idea中演示) 

一、打包成jar 

1)先new 一个Spring Starter Project 

SpringBoot项目打成war和jar的区别「建议收藏」

这里注意packaging默认为jar,不用修改.

2)创建完成后项目的pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3)打成jar包(通过maven命令的方式): 
在Terminal窗口,使用 mvn clean package 命令打包: SpringBoot项目打成war和jar的区别「建议收藏」

然后在target目录下就能看到打包好的jar包了

SpringBoot项目打成war和jar的区别「建议收藏」

二、打包成war包形式 

1)可以在刚才创建的项目上做改动,首先打包成war需要一个ServletInitializer类,这个类的位置需要和启动类在同一个文件下

SpringBoot项目打成war和jar的区别「建议收藏」

 (如果一开始选择war包形式,会自动创建此类) 
2)修改pom.xml 
修改pom.xml的war将原先的jar改为war; 
3)如果我们的SpringBoot是使用html作为前端页面开发没有问题,但是如果我们想用jsp开发,这个时候就需要配置一些依赖了:主要是排除SpringBoot的内置Tomcat,添加javax.servlet-api和tomcat-servlet-api(SpringMVC还需要配置后缀); 
最后的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>8.0.36</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

因为SpringBoot默认推荐的是html,而不是jsp;经过上面的修改就可以使用jsp进行开发了; 
4)打包成war:使用mvn clean package 
如下: SpringBoot项目打成war和jar的区别「建议收藏」

打包成功后,就可以将war包放在tomcat下的webapps下,然后运行tomcat,启动项目了;
记录下来,以后用到的时候看 ^_^; 

(当然了,在创建项目的时候直接选择package为war,直接就能打成war包了)

当选择war为打包方式创建项目时,ServletInitializer是默认直接创建的

SpringBoot项目打成war和jar的区别「建议收藏」

此时,pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

直接 mvn clean package就能打包成功

SpringBoot项目打成war和jar的区别「建议收藏」 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142366.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • arp命令_arp协议的主要功能是什么

    arp命令_arp协议的主要功能是什么ARP(AddressResolutionProtocol)命令用于显示和修改“地址解析协议(ARP)”缓存中的项目ARP把IP地址解析成LAN硬件使用的媒体访问控制地址。以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包原理某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后就会进行数据传输。如果未找到,则广播A一个A

    2022年10月22日
  • android碎片整理工具,Android的碎片整理「建议收藏」

    android碎片整理工具,Android的碎片整理「建议收藏」Android手机与平板高级历史橡皮擦和性能的助推器★★★★第一轮中的新工具支付Android上最流行的新的生产力应用程序,下载吧!清除历史搜索,杀敌多余的电池寿命,增加单键的任务!“碎片整理免费的Andr??oid现在是十大最热AppBrain.com应用之一,现在下载”“真棒应用程序”-编辑推荐奖AppEggs.com_________________________________我们现…

  • dpkg说明_dpkg命令

    dpkg说明_dpkg命令dpkg与centos中的rpm相似,被用于安装,卸载及查询deb包信息。下面简单介绍基础命令。已有安装包:test.deb。安装命令:dpkg-itest.deb安装test.deb软件包dpkg-ctest.deb#查看test.deb软件包中包含的文件结构安装后查询命令:dpkg-Itest查看已安装的test.deb软件包的详细信息,包括软件名称、版本等dpkg-Ltest#查看已安装test.deb软件包安装的所有文件dpkg-stest#查看test.

  • 角度与弧度互转_如何将角度转为弧度

    角度与弧度互转_如何将角度转为弧度1、角度定义   两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。(单位:º)2、弧度定义   两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度(单位:rad)。可简单理解为:弧度=弧长/半径3、弧长与弧度   3.1圆的周长C的计算…

  • 八路抢答器一个数码管C语言,八路抢答器设计 – 八路抢答器电路设计方案汇总(五款模拟电路设计原理及工作原理详细)…「建议收藏」

    八路抢答器一个数码管C语言,八路抢答器设计 – 八路抢答器电路设计方案汇总(五款模拟电路设计原理及工作原理详细)…「建议收藏」八路抢答器电路设计方案四:一个简单的的八路抢答器电路详细电路设计方案:八路抢答器电路图八路抢答器电路设计方案五:基于74LS148和74LS297的八路抢答器设计要求与内容在许多比赛活动中,为了准确、公正、直观地判断出第一抢答者,通常设置一台抢答器,通过数显、灯光或音响等多种手段指示出第一抢答者。(1)设计制作一个可容纳8组参赛的数字式抢答器,每组设置一个抢答按钮供抢答者使用。(2)电路具有第一抢…

    2022年10月20日
  • kali制作安卓免杀木马_kali linux激活成功教程WiFi

    kali制作安卓免杀木马_kali linux激活成功教程WiFishellcode超级免杀作者声明:本文章属于作者原创,不能转载,违反网络安全法自己承担.这里只供学习使用.日期:2019-12-31我试过了电脑管家,火绒安全,McAfee,360,但只有360使用手动云查杀时木马才能查出来(目前所有软件都无法查杀!!!!!2020-1-2)从2019-12-29日早上起,我向我的PE-tools工具里写了一个功能,就是shellcode注入功能,写…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号