SpringBoot项目资源分离打包方式+Maven Docker镜像构建

395 阅读1分钟

摘要:本文主要介绍SpringBoot项目资源分离打包方式和基于该方式的maven+docker镜像构建一体化流程;资源分离方式,可以极大程度方便现场临时解决问题,而不用出新的镜像。

SpringBoot项目

我本地案例是基于SpringBoot3的,默认2.X的版本都是支持的。

默认的pom.xmlbuild配置

    <build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

资源分离方式打包配置

需要新增一个plugin,如下

            <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>unpack</id>
						<phase>package</phase>
						<goals>
							<goal>unpack</goal>
						</goals>
						<configuration>
							<artifactItems>
								<artifactItem>
									<groupId>${project.groupId}</groupId>
									<artifactId>${project.artifactId}</artifactId>
									<version>${project.version}</version>
								</artifactItem>
							</artifactItems>
						</configuration>
					</execution>
				</executions>
			</plugin>
  • 然后执行mvn clean install -Dmaven.test.skip=true打包

target文件夹下会出现dependency文件夹,里面的东西就是我们需要的

---BOOT-INF
---META-INF
---org

这种资源分开的启动方式,切换到BOOT-INF目录

  • windowsjava -cp classes;lib/* com/github/huzhihui/statics/StaticsApplication
  • linuxjava -cp classes:lib/* com/github/huzhihui/statics/StaticsApplication

基于mavendocker镜像构建

使用的maven插件io.fabric8docker-maven-plugin,新增配置如下

            <plugin>
				<groupId>io.fabric8</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>0.37.0</version>
				<configuration>
					<dockerHost>docker2375开放的端口</dockerHost>
					<registry>你的镜像仓库</registry>
					<authConfig>
						<push>
							<username>镜像仓库的用户名</username>
							<password>镜像仓库的密码</password>
						</push>
					</authConfig>
					<images>
						<image>
							<name>springboot/sp3:${image.tag}</name>
							<build>
								<dockerFile>${project.basedir}/src/main/docker/Dockerfile</dockerFile>
								<assemblies>
									<assembly>
										<name>target</name>
										<descriptorRef>artifact</descriptorRef>
										<targetDir>${project.basedir}/target</targetDir>
									</assembly>
								</assemblies>
							</build>
						</image>
					</images>
				</configuration>
			</plugin>

新增Dockerfile文件

随便指定目录,我写在src/main/docker/Dockerfile

FROM huzhihui/jdk8:latest
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF /app/BOOT-INF
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/org /app/org
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-cp","/app/BOOT-INF/classes:/app/BOOT-INF/lib/*", "com/github/huzhihui/MinIoApplication"]