springboot工程,通常我们在pom.xml中配置了spring-boot-maven-plugin插件后,就可以将springboot工程打包为一个可执行Jar,然后通过java -jar xx.jar的方式就可以运行你,非常方便。

但是,该插件是件所有依赖的jar和资源文件都打到你要的jar包中,有时候我们可能想将资源文件和第三方依赖分开,不要打到jar中。比如在测试环境或线上更新某个class,如果要将整个包含第三方依赖和资源文件的jar上传,那是很大的,也是不必要的。

这里我们想实现的效果如下:

  • doctors-2.0.0.jar是我们最终打的jar包,它只包含我们自己写的java文件编译后的class。
  • resource是我们项目的资源文件
  • lib是项目依赖的第三方jar

现在我们借助4个maven插件来实现这一目的

完整pom如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<plugins>

    <!--打包jar-->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <!--不打包资源文件,exclude的目录不是src下面的,是以编译结果classes为根目录计算-->
            <excludes>
                <exclude>/config/**</exclude>
                <exclude>/META-INF/**</exclude>
                <exclude>/mybatis/**</exclude>
                <exclude>/public/**</exclude>
                <exclude>/schema/**</exclude>
                <exclude>/static/**</exclude>
                <exclude>/templates/**</exclude>
                <exclude>*.yml</exclude>
                <exclude>*.xml</exclude>
                <exclude>*.properties</exclude>
                <exclude>*.json</exclude>
                <exclude>*.bpmn</exclude>
            </excludes>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <!--MANIFEST.MF 中 Class-Path 加入前缀-->
                    <classpathPrefix>lib/</classpathPrefix>
                    <!--jar包不包含唯一版本标识-->
                    <useUniqueVersions>false</useUniqueVersions>
                    <!--指定入口类-->
                    <mainClass>com.doctors.Application</mainClass>
                </manifest>
                <manifestEntries>
                    <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                    <Class-Path>./resources/</Class-Path>
                </manifestEntries>
            </archive>
            <outputDirectory>${project.build.directory}</outputDirectory>
        </configuration>
    </plugin>

    <!--拷贝依赖 copy-dependencies-->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>
                        ${project.build.directory}/lib/
                    </outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <!--拷贝资源文件 copy-resources-->
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-resources</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <resources>
                        <resource>
                            <directory>src/main/resources</directory>
                        </resource>
                    </resources>
                    <outputDirectory>${project.build.directory}/resources</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <!--spring boot repackage,依赖 maven-jar-plugin 打包的jar包 重新打包成 spring boot 的jar包-->
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖-->
            <includes>
                <include>
                    <groupId>null</groupId>
                    <artifactId>null</artifactId>
                </include>
            </includes>
            <layout>ZIP</layout>
            <!--使用外部配置文件,jar包里没有资源文件-->
            <addResources>true</addResources>
            <outputDirectory>${project.build.directory}</outputDirectory>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
                    <!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
                    <!--<classifier>run</classifier>-->
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

参考:https://www.jianshu.com/p/dbdece9062b3

然后我们将生成的.jar文件、resources目录和lib目录拷贝到服务器上,使用java -jar xx.jar即可。
可以使用nohup后台运行程序:

1
nohup java -jar xx.jar &

参考:https://www.cnblogs.com/zery/p/7799005.html

一个注意点:排除资源目录,是以编译后的class目录开始计算的,不是src开始。