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的区别「建议收藏」 

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

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

(0)
上一篇 2022年5月10日 上午11:40
下一篇 2022年5月10日 下午12:00


相关推荐

  • java 框架_java三大主流框架是什么[通俗易懂]

    java 框架_java三大主流框架是什么[通俗易懂]原标题:java三大主流框架是什么java的三大主流框架指:SSH,即:Spring、Struts、Hibernate。Spring:Spring是一个开源、轻量级的java框架;它是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring是一个解决了许多在J2EE开发中常见的问题的强大框…

    2022年7月8日
    33
  • IE中出现 “Stack overflow at line“ 错误的解决方法

    IE中出现 “Stack overflow at line“ 错误的解决方法IE中出现”Stackoverflowatline”错误的解决方法

    2022年7月15日
    15
  • QT多线程中槽函数如何执行分析「建议收藏」

    周末天冷,索性把电脑抱到床上上网,这几天看了dbzhang800博客关于Qt事件循环的几篇Blog,发现自己对Qt的事件循环有不少误解。从来只看到现象,这次借dbzhang800的博客,就代码论事,因此了解到一些Qt深层的实现,虽然是在Qt庞大的构架里只算的是冰山的一角,确让人颇为收益。从dbzhang800的博客中转载两篇关于事件循环的文章,放…

    2022年4月13日
    112
  • 协程

    协程介绍协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。、需要强调的是:对比操作系统控制

    2022年3月29日
    56
  • linux抓包怎么查看数据包_shell curl获取返回数据

    linux抓包怎么查看数据包_shell curl获取返回数据(1)想要截获所有210.27.48.1的主机收到的和发出的所有的分组:#tcpdumphost210.27.48.1(2)想要截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):#tcpdumphost210.27.48.1and(210.27.48.2or210.27.48.3)(3)如…

    2022年10月14日
    7
  • 精选目标检测3——yolo1、yolo2、yolo3和SSD的网络结构汇总对比

    精选目标检测3——yolo1、yolo2、yolo3和SSD的网络结构汇总对比学习前言各个网络的结构图与其实现代码1、yolo12、yolo23、yolo34、SSD总结学习前言……最近在学习yolo1、yolo2和yolo3,事实上它们和SSD网络有一定的相似性,我准备汇总一下,看看有什么差别。各个网络的结构图与其实现代码1、yolo1在这里插入图片描述由图可见,其进行了二十多次卷积还有四次最大池化,其中3×3卷积用于提取特征,1×1卷积用于压缩特征,最后将图像压缩到7x7xfilter的大小,相当于将整个图像划分为7×7

    2022年6月15日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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