SpringBoot 打包jar并生成docker镜像

发布于 2020-04-14  334 次阅读


SpringBoot打包可以是war(tomcat需要),或者jar直接执行,我这里打包的jar,然后利用google的插件jib可以直接生成docker镜像提交到自己仓库

配置打包jar

首先得配置下多环境多配置文件,比如开发环境是这一套配置,生产环境,测试环境等等

先新建好对应的目录,以及放好对应的配置文件

然后在pox.xml中添加以下配置,根据个人需求进行修改

<profiles>
        <!--测试环境-->
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
        </profile>
        <!--开发环境-->
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
         <!--生产环境-->
        <profile>
            <id>pro</id>
            <properties>
                <env>pro</env>
            </properties>
            <activation>
                <!--默认激活-->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>

最后在pox.xml中的build节点下,添加以下配置,关键是${env},获取上面所激活的(activeByDefault=true)的那个配置

<build>        
        <resources>
            <resource>
                <directory>src/main/resources.${env}</directory>
            </resource>
        </resources>
  <!--.......省略其他 -->
</build>   

多环境多配置到这就可以了,然后是配置打包jar,直接放完整配置,本配置依赖包以及resources都是与jar分离的,方便更新,

注意以下地方的修改

  • maven-jar-plugin插件中的mainClass参数,里面是你的SpringBoot启动类, excludes参数是要排除哪些目录文件,因为这个配置文件的打包配置,是资源、依赖是与jar分离的
 <properties>
   <!--SpringBoot启动类-->
    <start-class>com.loneking.StartApplication</start-class>
    <java.version>1.8</java.version>
 </properties>
  
<dependencies>
   <!--......你的一些依赖 -->
</dependencies>
  <!--多环境多配置-->
<profiles>
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <env>pro</env>
            </properties>
            <activation>
                <!--默认激活-->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>
   <build>
        <finalName>lkAdmin</finalName>
        <resources>
            <resource>
                <directory>src/main/resources.${env}</directory>
            </resource>
        </resources>

        <!--这里面一般都自带的那些,不需要额外配置-->
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>

                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
       <plugins>
            <!-- 打包JAR包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>s
                            <!-- jar包不包含唯一版本标识 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!--MANIFEST.MF 中 Class-Path 加入前缀-->
                            <classpathPrefix>libs/</classpathPrefix>
                            <!--配置jar启动类 -->
                            <mainClass>com.loneking.StartApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                            <Class-Path>./resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <excludes>
                        <exclude>*.*</exclude>
                        <exclude>static/**</exclude>
                        <exclude>templates/**</exclude>
                        <exclude>mapper/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- 该插件的作用是用于复制依赖的jar包到指定的文件夹里 -->
            <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>
                            <!--依赖包输出到libs目录下-->
                            <outputDirectory>${project.build.directory}/libs</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <!--依赖包的文件名是否包含版本号-->
                            <stripVersion>true</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 该插件的作用是用于复制指定的文件 -->
            <plugin>
                <!-- 复制resources目录下文件 -->
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <!--指定resources目录,根据配置的当前环境-->
                                    <directory>src/main/resources.${env}</directory>
                                </resource>
                            </resources>
                            <!--输出到resources目录-->
                            <outputDirectory>${project.build.directory}/resources</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- SpringBoot 打包插件,把 maven-jar-plugin 打成的jar包重新打成可运行jar包 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 -->
                    <includes>
                        <include>
                            <groupId>null</groupId>
                            <artifactId>null</artifactId>
                        </include>
                    </includes>
                    <layout>ZIP</layout>
                    <!--使用外部配置文件,jar包里没有资源文件 -->
                    <addResources>true</addResources>
                    <outputDirectory>${project.build.directory}/resources</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
                            <!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
                            <!--<classifier>run</classifier> -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

这些配置完后,就可以在根目录执行mvn package命令,或者在idea右边选择maven,手动点击package选项进行打包,

打包完应该会在target目录下生成resources目录、libs目录以及项目名.jar文件

生成docker镜像并提交

首先在pox.xml的顶部,properties节点下添加配置,你docker仓库的url

   <properties>
        <registry_url>registry.hub.docker.com/your_user_name/project_name</registry_url>
    </properties>

然后是配置jib插件,在plugins节点下添加

<!--在生成jar后,将jar打包到docker镜像内并提交到自己仓库-->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.1.0</version>
                <configuration>
                    <!--配置基本镜像-->
                    <from>
                        <image>openjdk:8-jdk-alpine</image>
                    </from>
                    <!--配置最终推送的地址,仓库名,镜像名-->
                    <to>
                        <image>${registry_url}</image>
                           <!--方式1  账户密码配置 方式2在maven的settings.xml中servers节点中设置-->
                          <auth>
                            <username>${registry_username}</username>
                            <password>${registry_password}</password>
                        </auth>
                    </to>
                    <!--容器相关的属性-->
                    <container>
                        <ports>
                            <!--需要开放的端口-->
                            <port>8080</port>
                        </ports>
                    </container>
       </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

提交到docker仓库必然是需要账户密码的,为了安全在本地maven的settings.xml中配置,也可以直接在plugin添加节点

1.在jib插件的plugin->configuration->from/to节点中设置账户密码

                         <auth>
                            <username>${registry_username}</username>
                            <password>${registry_password}</password>
                        </auth>

2.在maven的settings.xml中servers节点下设置账户密码,其实这段放到 plugin->configuration 下也可以,注意id是需要验证用户名密码的域名

 <servers> 
   <server>
      <id>registry.hub.docker.com</id>
      <username>your_username</username>
      <password>your_password</password>
    </server>
</servers>

这个时候再执行mvn package,当打包jar结束时,就会调用jib插件去上传到你的docker仓库

成功输出信息

INFO] Built and pushed image as registry.hub.docker.com/loneking/lkadmin
[INFO] Executing tasks:
[INFO] [===========================   ] 88.9% complete
[INFO] > launching layer pushers
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:11 min
[INFO] Finished at: 2020-04-14T16:44:37+08:00
[INFO] ------------------------------------------------------------------------