• 通过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中开启远程访问即可。

  • 相关阅读:
    视图、触发器、事务、存储过程、函数,流程控制
    权限管理,pymysql模块
    单表查询
    sql逻辑查询语句的执行顺序
    Mysql数据库基础知识
    库,表,记录的相关操作
    并发编程之IO模型
    并发编程之协程
    并发编程之多线程
    事件委托
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/11790746.html
Copyright © 2020-2023  润新知