Springboot 打包

1,常用的三种打包方式

  • jar 可以直接运行,一般用于被引用的模块 java -jar
  • war 丢在 tomcat/webapp 中运行的,一般用于整个项目模块
  • pom 用于多模块中的父模块

1. jar 默认打包方式就是 jar

  <packaging>jar</packaging>
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

运行 jar -jar 打好的 jar 路径, 接口 url 为 ip + 配置文件的 port + 配置文件的 contentx-path

2. war

  <packaging>war</packaging>
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

部署时候放到 tomcat 的 webapp 中,端口是 tomcat 的端口,项目根目录是 war 包在 webapp 路径下的名字

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

2,项目中引入第三方 jar 包或者本地 jar 包

可能 maven 仓库中没有我们需要的 jar 包,这时候就需要在引入第三方 jar 包,一般有两种方法

1)第一种种是将本地jar包放入项目目录中
2)第二种是将本地jar包安装在本地maven库

1. 项目中需要引入本地 jar 包,项目打包方式为 jar

1, 现在 resources 下创建一个 lib 文件夹,并将对应得 jar 包复制进来

2, pom 文件

  <dependency>
      <groupId>com.bdip</groupId>
      <artifactId>weaver-webservice-2</artifactId>
      <version>1.0</version>
      <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
      <scope>system</scope> 
      <systemPath>${basedir}/src/main/resources/lib/xmlbeans-2.3.0.jar</systemPath> <!--项目根目录下的lib文件夹下-->
  </dependency>
  <dependency>
      <groupId>com.bdip</groupId>
      <artifactId>weaver-webservice-1</artifactId>
      <version>1.0</version>
      <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
      <scope>system</scope> 
      <systemPath>${basedir}/src/main/resources/lib/XmlSchema-1.4.7.jar</systemPath> <!--项目根目录下的lib文件夹下-->
  </dependency>

  <build>
     <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <!-- 打包的时候不加这个会找不到 jar 包 -->
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

scope 值得含义

  compile,缺省值,适用于所有阶段,会随着项目一起发布。
  provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
  runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

2. 项目中需要引入本地 jar 包,项目打包方式为 war

1, 现在 resources 下创建一个 lib 文件夹,并将对应得 jar 包复制进来

2,pom 文件

    <packaging>war</packaging>
    <dependency>
        <groupId>com.bdip</groupId>
        <artifactId>weaver-webservice-2</artifactId>
        <version>1.0</version>
        <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
        <scope>system</scope> 
        <systemPath>${basedir}/src/main/resources/lib/xmlbeans-2.3.0.jar</systemPath> <!--项目根目录下的lib文件夹下-->
    </dependency>
    <dependency>
        <groupId>com.bdip</groupId>
        <artifactId>weaver-webservice-1</artifactId>
        <version>1.0</version>
        <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
        <scope>system</scope> 
        <systemPath>${basedir}/src/main/resources/lib/XmlSchema-1.4.7.jar</systemPath> <!--项目根目录下的lib文件夹下-->
    </dependency>
    
    <!-- 这个地方用 spring-boot-maven-plugin 也行 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <webResources>
                        <resource>
                            <!-- 本地 jar 包相对路径 -->
                            <directory>src/main/resources/lib/</directory>
                            <!-- 打完包后的 jar 包路径 -->
                            <targetPath>WEB-INF/lib/</targetPath>
                            <includes>
                                <include>**/*.jar</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

3, 启动类得改, 继承 SpringBootServletInitializer 类,重写 configure 方法

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

      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
          return super.configure(builder);
      }
  }

3. 将本地jar包安装在本地maven库,再去引用

1, 将下载好的 jar 包打包到本地 maven 库中

  mvn install:install-file -Dfile=F:/ojdbc8.jar -DgroupId=com.oracle.jdbc -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar

  -Dfile=F:/ojdbc8.jar 参数设置我下载的jar包的本地存放路径

  -DgroupId=com.oracle.jdbc 参数为要安装的jar包所要指定在maven仓库中的groupid坐标值

  -DartifactId=ojdbc8 参数为要安装的jar包所要指定在maven仓库中的artifactId坐标值

  -Dversion=12.2.0.1 参数为要安装的jar包所要指定在maven仓库中的version坐标值

  -Dpackaging=jar 参数为要安装的jar包所要指定在maven仓库中的install 格式

2,在项目的 pom 中引用

  <dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1<version>
  </dependency>

3. 可执行 jar 包和依赖 jar 包

1. 可执行 jar 包

可执行 jar 包,需要 spring-boot-maven-plugin 插件,会生成两个 jar 包,.jar 是可执行 jar 包,.original 是原本的依赖包,repeckage 重新命名成这样的。可执行 jar 包需要有程序入口,对于 springboot 来说就是 @SpringBootApplication 修饰的启动类。

父模块:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.2.RELEASE</version>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

子模块(需要打成可执行 jar 的模块):

  <build>
     <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

可执行 jar 包结构:

2. 依赖 jar 包

Pom 中添加 spring-boot-maven-plugin 插件,生成的就是可执行 jar 包。不加这个插件,使用 mvn package 命令,生成的就是依赖 jar 包。依赖 jar 包 不需要程序启动入口,用来被引用。

依赖 jar 包结构:

3. 可执行 jar 包和依赖 jar 包区别

  • 可执行 jar 包要比依赖 jar 包大,它包含了底层的依赖和编译后的 class 文件还有入口方法,不能用于依赖包
  • 依赖包不包含需要的依赖,需要自行引入,这应该就是类似 mybatis 依赖引入后还要引入 mysql 依赖的原因吧,猜的。

4, Tomcat 启动

 Linux下tomcat服务的启动、关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:
 切换到tomcat主目录下的bin目录(cd usr/local/tomcat/bin)
  1,启动tomcat服务
    方式一:直接启动 ./startup.sh
    方式二:作为服务启动 nohup ./startup.sh &
    方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务
  解释:
    通过方式一、方式三启动的tomcat有个弊端,当客户端连接断开的时候,tomcat服务也会立即停止,通过方式二可以作为linux服务一直运行
    通过方式一、方式二方式启动的tomcat,其日志会写到相应的日志文件中,而不能动态地查看tomcat控制台的输出信息与错误情况,通过方式三可以以控制台模式启动tomcat服务,
    直接看到程序运行时后台的控制台输出信息,不必每次都要很麻烦的打开catalina.out日志文件进行查看,这样便于跟踪查阅后台输出信息。tomcat控制台信息包括log4j和System.out.println()等输出的信息。
  2,关闭tomcat服务
    ./shutdown.sh

5,项目生产 war 包容易出现的问题

此问题困扰我许久

(1) 问题描述

使用Maven打包项目的时候,出现错误:
webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update)

(2) 问题分析

web项目下缺少WEB-INF/web.xml

当是在servlet 3.0之后,对于web.xml文件本身是可选的

(3) 解决方案

  1. 在pom.xml文件中定义一个参数配置
<properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
  1. 更新maven-war-plugin的版本
<plugin>
  <artifactId>maven-war-plugin</artifactId>
  <version>3.0.0</version>
</plugin>
  1. 在webapp目录下创建WEB-INF/web.xml
posted @ 2021-08-18 18:35  primaryC  阅读(551)  评论(0编辑  收藏  举报