通过Maven发部项目的最实用配置
通过Maven发部项目的最实用配置
一、问题
我们平时开发项目,使用Maven或者Idea部署,尽可能是要做到自动化。一般情况下,做成自动化的方式有多种,下面简述我比较常用的3种。
二、解决方案一:
(1)配置发部:使用IDEA自带的Artifacts功能,先打开【File】菜单下的【Project
Structure】菜单,点到【Artifacts】,按自己的项目类型添加一个类别,比如SpringBoot项目,可以添加为【JavaEE
Application Exploded】项,起个名称,然后在要发部的右侧的【Available
Element】列表列出的微服务或者主模块上,右击选择【Put Into Output Root】,然后点击【Apply】并点击【OK】保存。
(2)执行发部:配置完后,执行IDEA主菜单顶部的【Build】-【Build Artifacts…】-【Rebuild
All】,编译完成后,将自动发部到项目根目录下的out/artifacts/xxx目录下。
(3)发部运行:发部运行的方式,有很多种,比如最简单的方法之一是,使用IDEA自带的【Tools】-【Deployment】-【Deployment】中配置远程FTP服务器,或者配置SSH连接,用于一键发部文件到生产环境上指定目录下。然后配置一个Dockerfile和一个start.sh角本,并通过”docker
build -t myapp:v1
.”命令事先部署部署一个DockerSwarm或者Docker程序。把程序文件映射到远程服务器的物理磁盘上。然后通过前面的IDEA的配置配置到FTP该目录。这样就可以一键自动发部项目了。缺点是一般IDEA的配置不会提交到GIT里,所以如果有同事需要发部,还得使用你的电脑,或者他自己电脑上也做相同的配置,来发部项目。
FROM openjdk:8-jre
MAINTAINER songxingzhu
WORKDIR /app
ADD ./ /app/
ENV JAVA_OPTS "-Xms400m -Xmx3g"
ENV spring.profiles.active test
ENV file.encoding UTF-8
EXPOSE 8081
RUN chmod 777 /app/start.sh
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["/app/start.sh"]
二、解决方案二:
(1)配置发部:在要发部的模块的pom.xml中,添加下列代码:
<build>
<finalName>service-webapi</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<!-- 设置源文件编码方式 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.test.webapi.WebApiApplication</mainClass>
</manifest>
</archive>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>
<exclude>*.properties</exclude>
<exclude>*.xml</exclude>
<exclude>*.sh</exclude>
</excludes>
</configuration>
</plugin>
<!-- 拷贝依赖的jar包到lib目录 -->
<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}/classes/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 解决资源文件的编码问题 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
(2)执行发部:在项目目录下,执行 mvn package
即可,编译完后,代码会出现在相应的模块的/target/classes目录下(发部到此目录的原因是,这样就不会影响IDEA的正常使用)
。如果要跳过测试,可以在父模块或者相应的模块的pom.xml中,添加下列内容,即可实现:
<!--编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<skip>true</skip>
</configuration>
</plugin>
<!--跳过测试-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
(3)发部运行:同上。
三、解决方案三:
方案三,使用Gitlab的CICD(需要Gitlab安装gitlab-
runner)或者使用Jenkins,结合Docker来做。因为平时做的最多客户一般都不太愿意提供服务器部署Kubernetes,所以我一般会用Docker
Swarm来做,简单方便又轻量级。使用CICD的DevOps模式比较推荐,团队每个人只要Merge一下代码到指定分支,即可完成自动化编译、测试、发部部署,因为也不复杂,我这里时间紧张就不描述了。
四、解决方案四:
方案四,配置IDEA+Docker实现。在IDEA中默认安装了Docker插件,因此可以直接在Dockerfile执行运行,并配置一下Dockerfile的镜像编译命令和远程Docker中开启远程访问即可。