1. 程式人生 > 實用技巧 >基於ABP做一個簡單的系統——實戰篇:4.基於富文字編輯器,Razor模板引擎生成內容並匯出Word 填坑記錄

基於ABP做一個簡單的系統——實戰篇:4.基於富文字編輯器,Razor模板引擎生成內容並匯出Word 填坑記錄

Maven概念

一個【基於Java平臺】的 【自動化構建工具】 ,其他類似的構建工具有make-ant-maven-gradle

基於Java平臺:安裝maven前一定要配置好JDK環境

自動化構建工具:eclipse就是自動化構建工具,幫助我們把java編譯為class檔案

Maven安裝

(1)下載JDK並配置環境變數

(2)下載maven(http://maven.apache.org/download.cgi

(3)解壓安裝包,並配置maven環境變數

  a.配置MAVEN_HOME : D:\apache-maven-3.6.3\bin     b.配置path:%MAVEN_HOME%\bin

  命令列視窗下用mvn -v驗證安裝是否成功

以上三步就已經成功安裝了maven,但為了讓你的maven使用經歷更加暢快,你還需要做出以下一些小修改

(1)增加Maven映象

  Maven 倉庫預設在國外, 國內使用難免很慢,我們可以更換為阿里雲的倉庫。

  Maven安裝目錄下,找 conf ----->settings.xml,在 mirrors 標籤下加入下面內容

<mirror>
         <!--This sends everything else to /public -->
         <id>nexus-aliyun</
id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>

(2)修改本地倉庫位置

  Maven預設本地倉庫地址在C盤,隨著專案的增加,這無疑會使得C盤變的臃腫,可以修改C盤的路徑。

  Maven安裝目錄下,找 conf ----->settings.xml,修改localRepository

標籤中的地址到你開心的位置。

<localRepository>F:/soft/MVN_repository</localRepository>

(3)修改IDE的配置,使本地倉庫生效

無論是eclipse還是idea,都需要修改

Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings選擇你之前配置的settings.xml

Idea:File---->Settings---->Maven---->User settings file選擇你之前配置的settings.xml

maven常用命令

安裝完成後,不要先著急使用,還有一些知識需要你進行了解,以便於你更好的使用maven

maven生命週期總的來分為clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比較偏向於實踐,具體的生命週期的知識筆者不再贅述(生命週期的知識比較偏理論,但也挺重要的,還是希望大家自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命週期的一些階段對應著maven的一些常用命令,

命令描述
mvn clean 刪除target目錄(刪除編譯檔案的目錄)
mvn compile 只編譯main目錄中的java檔案
mvn test 執行test目錄下的測試用例
mvn package 將編譯後的程式碼打包成可分發格式的檔案,比如JAR、WAR或者EAR檔案。
mvn install 安裝專案包到本地倉庫,這樣專案包可以用作其他本地專案的依賴

值得注意的是,每一個命令執行時,該命令之前以及包括該命令在內的所有命令都會被執行,比如執行了mvn install,前邊的五條命令也都會被執行。

POM檔案

為了方便理解,先對常見的pom檔案結構進行講解,掌握了下邊的檔案結構,基本上你就可以關掉本篇博文,使用maven進行開發了,但如果你對此並不滿足,可以繼續向下看

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--宣告專案描述符遵循哪一個POM模型版本。模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是為了當Maven引入了新的特性或者其他模型變更的時候,確保穩定性。 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標誌,並且配置時生成的路徑也是由此生成, 如com.liu.learning,maven會將該專案打成的jar包放本地倉庫下的:/com/liu/learning 目錄下下-->
<groupId>com.liu.learning</groupId>
<!-- 專案的唯一ID,一個groupId下面可能多個專案,就是靠artifactId來區分的 -->
<artifactId>HelloWorld01</artifactId>
<!-- 版本號 -->
<version>0.0.1-SNAPSHOT</version>
<!--專案的名稱, Maven產生的文件用 -->
<name>HelloWorld01</name>
<!--專案產生的構件型別,例如jar、war、ear、pom。 -->
<packaging>jar</packaging>
<!--專案描述 -->
<description>hello world</description>
<!-- 通過gav三個標籤就能確定某個jar包的位置,比如下邊通過gav引入junit -->

<!-- 統一JDK版本 -->
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>

<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- jar包的作用範圍,相關知識會摘出來單獨講解 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>

jar包的作用範圍scope

常用的三個分別是compile,test,provided 作用範圍如下表:

階段 \ scopecompiletestprovided
編譯 ×
測試
部署(執行) × ×

compile:預設值,如果不顯式宣告預設為compile,適用於所有階段,會隨著專案一起釋出。

test:jar包只在測試階段需要,常見的jar比如說junit

provided:jar包只在編譯和測試時需要,這種比較少見,比如說servlet-api.jar,編譯和測試時需要servlet 環境,但執行時由tomcat提供servlet環境,就不需要servlet-api.jar了

maven依賴與依賴排除

假如說我們需要用到A.jar,但是A.jar中又用到了B.jar,maven會自動幫我們引入B.jar,最常見的例子就是spring-context.jar 了,大家可以自行嘗試將下邊依賴引入,maven不僅會將spring-context.jar引入,還會將spring-aop.jar,spring-beans.jar等其他jar包一併引入。

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>

但如果我們確實用不到其他jar但maven又幫我們引入了,那該怎們辦呢?

<!-- 方法一 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 方法二 -->

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>

maven依賴傳遞

在數學上,若A依賴於B,B依賴於C,那麼A依賴於C成立,但在Maven中還需要新增一個條件,要使 A.jar依賴於C.jar :當且僅當 B.jar 依賴於C.jar的範圍是compile.

建立maven專案A,B,其中B中引入junit.jar,然後將B用mvn install安裝到本地倉庫,再將B引入到A,改變junit的scope觀察A中是否引入junit。

實驗過程如上,讀者可自行實驗。

maven依賴原則

我們再來看下邊三個案例,

同一POM中引入同一jar包的不同版本時(不推薦這樣做),會使用哪個版本呢?

專案A->B,B->junit.jar(scope為compile),同時A->junit.jar,那麼A中又會使用哪個jar呢?

專案A依賴B和C,B和C都依賴了不同版本的junit.jar(scope為compile),那麼A中會使用哪個jar呢?

前兩個很好猜,第一個pom檔案寫在後邊的jar會覆蓋前邊的jar。第二個會選擇離自己最近的jar,也就是A中自己的jar。第三個同時也遵循 離自己最近的原則,但是兩者距離一樣,那怎麼辦呢?POM檔案中對B和C的依賴宣告總有先後順序吧,那就採用先宣告那個中的jar。

我們拋去第一個案例(開發中嚴禁這樣做),來總結下規則:

(1)路徑最近者優先。

(2)第一宣告者優先。

依賴繼承

父專案

<!-- 第一步:父專案必須宣告為pom -->
<packaging>pom</packaging>
<!-- 第二步:dependencies外層套上dependencyManagement -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>

子專案

<!-- 第一步:引入父專案的座標 -->
<parent>
<groupId>com.liu.learing</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑 -->
<!-- 父專案的pom.xml檔案的相對路徑。相對路徑允許你選擇一個不同的路徑。預設值是../pom.xml。Maven首先在 構建當前專案的地方尋找父項 目的pom,其次在檔案系統的這個位置(relativePath位置),然後在本地倉庫,最後 在遠端倉庫尋找父專案的pom。
-->
<relativePath>../parent/pom.xml</relativePath>
</parent>

<!-- 第二步:寫出要用到父專案的jar包名稱,不用寫版本號 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>

專案聚合

Maven專案能夠識別自身和本地倉庫中的專案,如果專案A依賴專案B,必須要把專案B進行打包安裝放入本地倉庫,然後再在專案A中引入才能使用。但是如果專案A依賴很多個其他專案,這樣一一打包安裝就比較麻煩了,這就引出了“聚合”。

總專案

<!-- 第一步:總專案必須宣告為pom -->
<packaging>pom</packaging>

<!--
第二步:總專案引入子專案地址,子專案 相對 總專案pom檔案 的 相對地址
注意:這裡是 子專案 而不是 子專案的pom檔案相對總專案pom檔案 ,這一點和依賴繼承不同
-->
<modules>
<module>../one</module>
<module>../two</module>
</modules>

統一管理版本

有時候開發專案過程會遇到版本號統一升級的問題,例如junit版本從3.0版本升級成4.12版 這個時候有兩個處理辦法 1、最原始的方法,在pom檔案裡統一 ctrl+f 搜尋替換一下。 2、高階點的方案,使用pom裡的properties標籤,自定義一個xxxx標籤,標籤內就是版本號,在需要使用的地方使用${xxx}靈活取出上面定義的值,這個樣子就不用那樣修改多個地方啦

    <properties>
<junit>4.12</junit>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit}</version>
<scope>compile</scope>
</dependency>
</dependencies>