spring boot既可以打成war发布,也可以找成jar包发布。默认采用jar包的形式。

jar包与war包的区别

jar包:直接通过内置tomcat运行,不需要额外安装tomcat。如需修改内置tomcat的配置,只需要在springboot的配置文件中配置。内置tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。

war包:传统的应用交付方式,需要安装tomcat,然后放到waeapps目录下运行war包,可以灵活选择tomcat版本,可以直接修改tomcat的配置,有自己的tomcat日志输出,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。

SpringBoot的jar包与普通jar的区别

SpringBoot的JAR包与传统JAR包的不同之处在于里面有一个名为lib的目录,该目录中包含了应用所依赖的其他JAR包和内置嵌入的Tomcat。

除了业务源码所编译形成的CLASS以外,在org目录下还有许多Spring所提供的CLASS,正是依赖这些CLASS加载位于lib目录下JAR中的类。这样的加载机制与在OSGi bundle中声明Bundle-Classpath很类似,不过在OSGi中会由容器来负责加载指定路径下的类。

image
image

jar包与war包package不同

packaging指定不同,一个是war,一个jar。

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.vcyber.www</groupId>
    <artifactId>vcyber-api</artifactId>
    <!--这个地方有所区别 -->
    <!--<packaging>war</packaging> -->
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>vcyber-api</name>
    <url>http://maven.apache.org</url>

继承的方式不同

war包需启动类继承SpringBootServletInitializer,而jar包不需要。war继承的方式:

@SpringBootApplication
@RestController
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}

spring boot内置tomcat

springboot内置tomcat容器,默认tomcat8的版本,war包部署时,需要在pom文件中有关跟tomcat有关系的jar包scope都设置成provided。去掉spring boot内置的tomcat代码:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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

运行

jar包可以直接通过java -jar来运行。Linux系统中关闭了控制台也就停止该Java进程。因此,需要以后台进程的形式启动。

nohup java -jar springboot.jar --server.port=port &

war包可以将其放到常用的web容器tomcat的webapps目录下,启动tomcat即可。

关于SpringBoot的war包使用全过程及demo,可参考该文章《SPRINGBOOT打成WAR包在TOMCAT或WILDFLY下运行》。



SpringBoot jar包和war包的区别及部署插图2

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2019/11/14/springboot-jar-war/