SpringBoot项目打包为jar包/war包过程(基于Maven)


SpringBoot项目完成开发后需要打包成jar包/war包,并部署运行,才算完成了整个项目的流程。

1、pom文件中

<build>
   <finalName>DAG-1.0</finalName>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.1</version>
           <configuration>
               <source>11</source>
               <target>11</target>
           </configuration>
       </plugin>

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

   <resources>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
               <include>**/*.yml</include>
           </includes>
           <filtering>true</filtering>
       </resource>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
               <include>**/*.yml</include>
           </includes>
           <filtering>true</filtering>
       </resource>
   </resources>
</build>

1.1 maven-compiler-plugin

maven-compiler-plugin可以指定项目中JDK的版本,以及指定编译生成的class文件的版本。在我的例子中我指定了开发时源代码中使用的是JDK11,生成的class文件也是对应JDK11.

1.2 spring-boot-maven-plugin

spring-boot-maven-plugin使用Maven进行打包的插件。repackage重新打包应用程序。默认情况下,repackage和run这两个maven目标会包括定义在工程中的任何依赖。

一些依赖被要求从可执行jar包中排除。下面有三种方式可以在包运行时排除依赖模块:

1.2.1 排除一个具体的maven模块

排除一个具体的maven 模块,通过唯一的groupId和artifactId组合来实现。(如果有必要,可以加入classifier来唯一确认。)

<build>
    <finalName>DAG-1.0</finalName>
    <plugins>
        ......
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <excludes>
                    <excludes>
                        <groupId>com.foo</groupId>
                        <artifactId>bar</artifactId>
                    </excludes>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
    ......
</build>

排除com.foo下的bar模块。

1.2.2 排除和“指定的artifactId”相符的所有maven模块

排除和“指定的artifactId”相符的所有maven模块。

<build>
    <finalName>DAG-1.0</finalName>
    <plugins>
        ......
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <excludes>
                    <excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
    ......
</build>

排除artifactIdmy-libanother-lib的所有模块,即所有groupIdartifactIdmy-libanother-lib的模块。

1.2.3 排除属于“指定的groupId”的所有maven模块

<build>
    <finalName>DAG-1.0</finalName>
    <plugins>
        ......
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <excludes>
                    <excludeGroupIds>com.foo</excludeGroupIds>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
    ......
</build>

排除groupIdcom.foo下的所有模块.

2、jar包名

<finalName>Your jar Package Name</finalName>

build中的fileName指定了打包生成的jar包的名字。

3、maven打包

在SpringBoot项目的根目录下执行如下命令:

mvn package spring-boot:repackage

即可在根目录下生成target文件夹,里面包含了xxx.jar.

4、运行jar包

4.1 控制台运行jar包

java -jar xxx.jar

4.2 后台运行jar包,关闭终端不影响jar包运行

nohup java -jar DAG-1.0.jar > msg.log 2>&1 &

后台运行jar包,日志信息输入到msg.log文件中,错误日志和正确日志都输入到msg.log中。
在命令最后加上&符号,表示让这个进程到后台去执行,这样立刻返回到提示符状态,我们可以接着做下面的事。

4.3 后台运行jar包,正确的日志和错误的日志分别输入到不同的文件中

nohup java -jar DAG-1.0.jar >> msg1.log 2>>msg2.log &

正确的日志输入到msg1.log中,错误的日志输入到msg2.log中.

5、打包生成war包

默认生成的是jar包。在pom文件中指定要生成的什么形式的包

<packaging>war</packaging>
<name>DAG-1.0</name>
<description>DAG project for Spring Boot</description>

执行打包命令

mvn package spring-boot:repackage

在这里插入图片描述
可以看到生成了war包,部署war包运行程序.

6、遇到的错误以及注意事项

6.1 访问HTML页面找不到对应的页面

这种情况首先要看一下,生成的target文件夹下面有没有对应的templates文件夹及其中应该包含有的xxx.html文件。程序运行时只认识target文件夹下的东西,如果target文件夹下面根本就没有对应的templates文件夹和xxx.html文件,肯定是无法打开HTML页面的。

造成这个错误的常见原因是没有指定将xxx.html作为项目的资源进行打包,这个需要在pom文件中指明。

<build>
	......
	<resources>
	    <resource>
	        <directory>src/main/resources</directory>
	        <includes>
	            <include>**/*.properties</include>
	            <include>**/*.xml</include>
	            <include>**/*.yml</include>
	            <include>**/*.html</include>
	        </includes>
	        <filtering>true</filtering>
	    </resource>
	    <resource>
	        <directory>src/main/java</directory>
	        <includes>
	            <include>**/*.properties</include>
	            <include>**/*.xml</include>
	            <include>**/*.yml</include>
	        </includes>
	        <filtering>true</filtering>
	    </resource>
	</resources>
<build>

如上面的,指明了src/main/resources文件夹下面的.properties文件、.xml文件、.yml文件、.html文件和src/main/java文件夹下面的.properties文件、.xml文件、.yml文件被作为项目的资源文件,因此在生成的target文件中才能找到html文件.

如果去掉对.html文件的指明,生成的target文件夹中找不到对应的HTML文件,也就打不开HTML页面了。

<build>
	......
	<resources>
	    <resource>
	        <directory>src/main/resources</directory>
	        <includes>
	            <include>**/*.properties</include>
	            <include>**/*.xml</include>
	            <include>**/*.yml</include>
	        </includes>
	        <filtering>true</filtering>
	    </resource>
	    <resource>
	        <directory>src/main/java</directory>
	        <includes>
	            <include>**/*.properties</include>
	            <include>**/*.xml</include>
	            <include>**/*.yml</include>
	        </includes>
	        <filtering>true</filtering>
	    </resource>
	</resources>
<build>

去掉后,生成的target文件夹中没有HTML文件.

没有templates文件夹及其中的HTML文件,运行程序将无法访问HTML页面.

6.2 target中生成了HTML文件,仍然找不到HTML页面

很有可能是thymeleaf的配置写错了。

thymeleaf.prefix处,一定要写正确,不能多一个/或者少写一个/,因为这样在写访问页面的,路径时就会多或则少一个/,将无法找到HTML页面.

6.3 pom文件中maven-compiler-plugin或者spring-boot-maven-plugin等插件无法正确的导入(变红)

需要在dependencies中引入这些用到插件,然后再在build中的plugins中引入这些插件.

猜你喜欢

转载自blog.csdn.net/qq_27198345/article/details/111319290