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] ------------------------------------------------------------------------
如果想直接运行该docker镜像,那么用以下代码,18080:8080中8080是容器内的端口,18080是宿主机端口
docker run -d -p 18080:8080 loneking/lkadmin
问题踩坑
1.jib默认的超时时间是20S,而20S经常出现docker镜像传不完,就会报错read timeout,所以需要手动设置下超时时间,命令如下,其实和执行mvn package一样,但是多了个超时参数
mvn compile jib:build -Djib.httpTimeout=60000
2.打包完直接java -jar xxx.jar就可以执行,如果执行出现问题,比如找不到类XXX,找不到启动类什么的,解压jar文件,检查META-INF目录下的MANIFEST.MF文件里内容是否正确,或者resources/libs文件夹里的内容是否正确无缺失
结尾,另一篇文章会描述编写docker-compose脚本,配置安装运行haproxy、redis、mysql、nginx、springboot