天天看點

通過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中開啟遠端通路即可。

宋興柱(Sindrol):轉載内容,請标明出處,謝謝!源文來自 寶貝雲知識分享:https://www.dearcloud.cn