對 maven 有必定基礎的同窗,想對 maven 有系統瞭解的同窗java
本文先會說下 maven 的幾個基本概念:依賴,倉庫,生命週期和插件、
而後是maven 的聚合和繼承、
而後再說 settings 文件和 pom 文件的相關配置、
最後再列出經常使用插件及使用 maven 遇到的一些問題及解決辦法web
A–>B–>C 當前項目爲A,A依賴於B,B依賴於C,那麼 A 依賴於 Cspring
若是 A-> B ,B 依賴於 junit 包,但 B 的 junit 包配置的 <scope>test</scope>
,則 junit 不會被 A 依賴。數據庫
經常使用的依賴範圍有apache
表示被依賴項目須要參與當前項目的編譯,還有後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候一般須要包含進去api
不會有傳遞依賴,也不會打包,依賴項目僅僅參與測試相關的工做,包括測試代碼的編譯和執行,例如:junittomcat
參與編譯,測試,運行,但打包的時候不會打進去,如 servlet-apimybatis
表示被依賴項目無需參與項目的編譯,不事後期的測試和運行週期須要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用運行和測試階段app
從參與度來講,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地文件系統拿。須要添加systemPath的屬性來定義路徑eclipse
A->B->C->common1.1.jar
A->common1.0.jar
那麼A最終會依賴common1.0.jar
A->B
A->C
B->common1.0.jar
C->common1.1.jar
A同時依賴B和C,那麼B和C誰先加載,就依賴誰的common.jar
通常用於去除一些無用的依賴,或使用最新的依賴包;如 spring 和 hibernate 都會使用 slf4j ,能夠自行決定是用 spring 依賴的,仍是用 hibernate 依賴的,或者二者都不用,使用最新的。
好比spring-core排除commons-loggoing
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency>
maven 的倉庫分爲本地倉庫、私服、和遠程倉庫,倉庫中放置的是 jar 包和 插件。
查找方式:本地->私服->遠程
私服對於我的開發是不須要的,但對於團隊開發是必須的;由於項目確定會分爲各個模塊,每一個人開發的模塊須要部署到私服上去,對方纔能訪問到。
<repositories> <!--配置阿里雲的倉庫,用於下載經常使用 jar 包--> <repository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> </repository> <!--配置公司倉庫,用於下載其它模塊包--> <repository> <id>company</id> <name>company nexus</name> <url>http://company/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> <!--這個默認是 false 須要本身打開 --> </repository> </repository> <!--配置插件倉庫--> <pluginRepositories> <pluginRepository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </pluginRepository> </pluginRepositories>
<profiles> <profile> <id>repo</id> <repositories> <repository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> </repository> </repositories> </profile> <profile> <id>env-dev</id> <activation> <property> <name>target-env</name> <value>dev</value> </property> </activation> <properties> <tomcatPath>/path/to/tomcat/instance</tomcatPath> </properties> </profile> </profiles> <!--激活屬性配置,能夠激活多個--> <activeProfiles> <activeProfile>repo</activeProfile> <activeProfile>env-dev</activeProfile> </activeProfiles>
在 pom 中配置發佈的地址,在 settings 中配置發佈的用戶名和密碼。
pom 配置發佈地址
<distributionManagement> <repository> <id>server-rel-id</id> <!--這個 id 須要和 servers 中的 id 一致--> <name>release-publish</name> <url>http://company/public</url> </repository> <snapshotRepository> <id>server-rel-id-snapshot</id> <name>release-publish</name> <url>http://company/public</url> </snapshotRepository> </distributionManagement>
settings 中配置用戶名密碼
<servers> <server> <id>server-rel-id</id> <username>repouser</username> <password>repopwd</password> </server> <server> <id>server-rel-id-snapshot</id> <username>repouser</username> <password>repopwd</password> </server> </servers>
<repository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> </repository>
maven 的生命週期是抽象的,具體的實現由插件完成。
Maven定義了三套生命週期:clean、default、site,每一個生命週期都包含了一些階段(phase)插件的目標 綁定到生命週期的階段來完成任務。三套生命週期相互獨立,但各個生命週期中的phase倒是有順序的,且後面的 phase 依賴於前面的 phase。執行某個phase時,其前面的phase會依順序執行,但不會觸發另外兩套生命週期中的任何phase。
好比執行package,前面的test、comiple等會運行。
default生命週期是最核心的,它包含了構建項目時真正須要執行的全部步驟。
一個插件一般能夠完成多個任務,每個任務就叫作插件的一個目標。如執行mvn install命令時,調用的插件和執行的插件目標以下:
Maven的生命週期是抽象的,實際須要插件來完成任務,這一過程是經過將插件的目標(goal)綁定到生命週期的具體階段(phase)來完成的。如:將maven-compiler-plugin插件的compile目標綁定到default生命週期的compile階段,完成項目的源代碼編譯:
<plutins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <executions> <execution> <phase>package</phase> <goals><goal>jar-no-fork</goal></goals> </execution> </executions> </plugin> </plugins>
聚合是爲了解決模塊的依賴關係,而且方便統一打包和測試。
對於每個模塊來講,都來寫一遍屬性配置,依賴配置,插件配置,倉庫配置未免太麻煩 ,並且很差管理;因此通常都會有一個父項目來配置好這麼東西,子項目不須要關心jar 版本,插件配置等信息。
通常把聚合和繼承這兩個統一放到一個 pom 文件中,作爲父項目存在,這兩個須要的打包方式爲 pom 。
<!--打包方式須要配置爲 pom --> <packaging>pom</packaging> <!-- 聚合的模塊列表,不須要關心順序,maven 會自動根據依賴關係順序--> <modules> <module>modul1</module> <module>modul2</module> </modules> <!--配置子項目可能須要用到的 jar 包--> <dependencyManagement> <dependencies> </dependencies> </dependencyManagement> <!--配置子項目可能須要用到的 插件--> <pluginManagement> <plugins> </plugins> </pluginManagement>
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
由於 maven 用的 jdk 通常版本都比較老,因此形成總是提示 jdk 版本不對的問題,這樣解決。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin>
把 mapper xml 文件放到同 mapper 同一級的時候 ,常常用找不到 xml 文件的問題,這樣解決,放到 build 子節點下
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources>
<properties> <failOnMissingWebXml>false</failOnMissingWebXml> </properties>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <executions> <execution> <phase>package</phase> <goals><goal>jar-no-fork</goal></goals> </execution> </executions> </plugin>
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> <archive> <manifest> <mainClass>com.learn.MyApp</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin>
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin>
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.2.11.v20150529</version> <configuration> <httpConnector> <port>8081</port> </httpConnector> <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory> <scanIntervalSeconds>10</scanIntervalSeconds> <webApp> <contextPath>/sanritools</contextPath> </webApp> </configuration> </plugin>
Excel 通用導入導出,支持 Excel 公式
https://blog.csdn.net/sanri1993/article/details/100601578
使用模板代碼 ,從數據庫生成代碼 ,及一些項目中常常能夠用到的小工具
https://blog.csdn.net/sanri1993/article/details/98664034