• springboot 发布 war jar区别


    fatjar

    看下springboot打成jar包后的结构和内容:

    springboot项目打包的jar

    普通jar:

    传统jar 通过上面两个图的对比,我们知道这个JAR包与传统JAR包的不同之处在于里面有一个名为lib的目录,在这个目录中包含了这个简单应用所依赖的其他JAR包,其中也包含内置的嵌入式Tomcat,正是使用它,才能发布服务和访问Web资源。除了我们编写的源码所编译形成的CLASS以外,在org目录下还有许多Spring所提供的CLASS,正是依赖这些CLASS,才能够加载位于lib目录下JAR中的类。这样的加载机制与在OSGi bundle中声明Bundle-Classpath很类似,不过在OSGi中会由容器来负责加载指定路径下的类。这大致阐述了这样一个JAR包能够发布服务的原因。

    一、packaging的方式不同

    一种设置成jar一种是war。 工程采用的是jar 的打包方式,所以在执行package 命令后,会产生一个jar 包。进入到这个目录用压缩软件打开此jar 包,其中我们发现了一个叫lib 的文件夹,打开lib 文件夹发现此文件夹下全是工程依赖的jar 包,甚至还有tomcat。这种包含有jar 包的jar包,我们称之为fatJAR( 胖jar 包)。 由于fatJAR 本身就包括tomcat , 我们就不需要另外部署了,直接在命令行就可以把我们的应用启动起来,在命令行,进入到jar 包所在的目录,我们可以通过以下java –jar命令来执行此jar 包。在控制台会出现启动信息,在浏览器访问程序

    spring-boot 默认提供内嵌的tomcat,所以打包直接生成jar 包,用java -jar 命令就可以启动。但是,有时候我们更希望一个tomcat来管理多个项目,这种情况下就需要项目是war格式的包而不是jar 格式的包。

    (1)修改pom.xml 将打包方式修改为war

    <packaging>war</packaging>
    

    添加依赖

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

    spring-boot-starter-tomcat 是原来被传递过来的依赖,默认会打到包里,所以我们再次引入此依赖,并指定依赖范围为provided,这样tomcat 相关的jar就不会打包到war 里了.

    (2)添加ServletInitializer

    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    public class ServletInitializer extends SpringBootServletInitializer {
         @Override
          protected SpringApplicationBuilder configure(SpringApplicationBuilderapplication) {
                  return application.sources(Application.class);
          }
    }
    

    由于我们采用web3.0 规范,是没有web.xml 的,而此类的作用与web.xml相同。

    (3)运行package 打包命令生成war 包 生成后将war 包放入tomcat,启动tomcat,测试完成的功能是否可以使用。

    二、继承的方式不同

    Application.java需要继承SpringBootServletInitializer,而jar包不需要。

    @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和war的取舍。

    到底是jar好?还是war好?

    目前认为jar包在集群或者做一些优化的话,没有war包方便。

    而如果很简单的应用的话jar包却不会像war包一样一定要找web容器运行那样复杂。

  • 相关阅读:
    python--HTTPClient接口测试踩坑
    python打印cookies获取cookie
    BeanShell使用json.jar包处理Json数据
    禁用缓存的过滤器Filter
    过滤器Filter(拦截jsp页面的跳转)案例:
    MVC模式:实现数据库中数据的增删改查功能
    JSTL.带标签体的标签,方法和例子
    javaBean的使用方法;
    JSTL,自定义一个标签的功能案例
    利用Session实现一次验证码
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/10642245.html
Copyright © 2020-2023  润新知