怎么推廣平臺江北seo頁面優(yōu)化公司
Maven
一、為什么使用maven
- 添加第三方jar包
- jar包之間的依賴關系
- 處理jar包之間的沖突
- 獲取第三方jar包
- 將項目拆分成多個工程模塊
- 實現(xiàn)項目的分布式部署
二、maven簡介
? Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。
? Maven 除了以程序構建能力為特色之外,還提供高級項目管理工具。由于 Maven 的缺省構建規(guī)則有較高的可重用性,所以常常用兩三行 Maven 構建腳本就可以構建簡單的項目。由于 Maven 的面向項目的方法,許多 Apache Jakarta 項目發(fā)文時使用 Maven,而且公司項目采用 Maven 的比例在持續(xù)增長。
三、maven的使用
1、下載和安裝
-
下載官網:http://maven.apache.org/download.cgi
-
解壓:要求目錄不要過深、不要有中文和特殊符號
-
必須配置JAVA_HOME環(huán)境變量
-
配置環(huán)境變量
- MAVEN_HOME 值為Maven的解壓路徑
- 在path中配置 %MAVEN_HOME%\bin
-
查看安裝是否正確:在cmd中通過命令
mvn -v
2、配置maven本地倉
-
本地倉位置(下載的jar包放置的位置):在解壓路徑的conf中的settings.xml,并配置阿里云鏡像。
-
在標簽中的最后添加本地倉的設置
<settings><localRepository>D:\mavenjar</localRepository> </settings>
-
在標簽中配置鏡像
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3、創(chuàng)建指定目錄
-
目錄結構(手動新建)
project
? src
? ——main
? ————java
? ————resources
? ——test
? ————java
? ————resources
? pom.xml
-
目錄表示
-
pom.xml文件中編寫
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.etime</groupId><artifactId>maven</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies> </project>
-
在src/mian/java/com/etime/maven路徑下創(chuàng)建Demo1.java
package com.etime.maven; public class Demo1{public String sayHello(String name){return "Hello "+name+"!";} }
-
在src/test/java/com/etime/maven路徑下創(chuàng)建創(chuàng)建TestDemo1.java
package com.etime.maven; import org.junit.Test;public class TestDemo1{@Testpublic void t01(){Demo1 d = new Demo1();String res = d.sayHello("World!");System.out.println(res); }
-
在控制臺中進入pom.xml文件所在目錄
-
執(zhí)行 mvn compile命令
-
查看根目錄變化和倉庫的變化(第一次會有點慢,下載指定的jar包,并將main當中的java文件編譯成字節(jié)碼文件)
-
根目錄的變化
-
倉庫的變化
-
-
cmd 中繼續(xù)錄入mvn clean命令
-
再次查看根目錄和倉庫的變化(清理之前生成的字節(jié)碼文件)
-
根目錄變化
-
倉庫變化
-
-
再次錄入 mvn compile命令
-
查看根目錄變化(快了很多,只重新生成字節(jié)碼文件,下載新配置的jar包(如果沒有新配置,則不需要下載))
-
根目錄變化
-
-
cmd 中錄入 mvn test-compile命令,
- 查看target目錄的變化(將test中的java文件編譯成字節(jié)碼文件)
-
target目錄變化
-
cmd 中錄入 mvn test命令,查看target目錄變化
-
執(zhí)行TestDemo1.java的結果:
-
target-test變化02
-
-
cmd 中錄入 mvn package命令,查看target目錄變化(將項目打包)
- target目錄變化
-
cmd 中錄入 mvn install命令, 查看本地倉庫的目錄變化(將項目打包并放到本地倉庫當中)
-
注意
- 運行Maven命令時一定要進入pom.xml文件所在的目錄!
四、maven核心概念
1、POM
(1) POM:Project Object Model,項目對象模型。
(2) 將Java工程的相關信息封裝為對象作為便于操作和管理的模型。
(3) Maven工程的核心配置。
(4) 可以說學習Maven就是學習pom.xml文件中的配置。
2、坐標
(1) maven的坐標
- groupId:公司或組織的域名倒敘(類似于:com.etime)
- artifactId:當前項目的模塊名稱(類似于:maven)
- version:版本
(2) 舉例
<groupId>com.etime</groupId>
<artifactId>maven</artifactId>
<version>1.0-SNAPSHOT</version>
(3) jar包的網站
- 網址:https://search.maven.org/search
(4) 通過坐標找到執(zhí)行的jar包
- 將 groupid、artiactid、version向量鏈接器得com.etime+maven+1.0 SVNPSHOT
- 根據(jù)上方拼接結果作為目錄結果在本地倉庫中進行查找
- D:\mavenjar\com\etime\maven\1.0-SNAPSHOT\maven-1.0-SNAPSHOT.jar
3、依賴
(1)創(chuàng)建需要引入依賴的項目
-
項目結結構
day02
? src
? ——main
? ————java
? ————resources
? ——test
? ————java
? ————resources
? pom.xml
-
在新建項目的pom.xml文件中編寫如下代碼
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.etime</groupId><artifactId>demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>com.etime</groupId><artifactId>maven</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies> </project>
-
在新建項目的src/main/java/com/etime/maven2中新建Demo02.java文件
package com.etime.maven1; import com.etime.maven.Demo1; public class Demo2{public String say(String name){Demo1 d = new Demo1();String res = d.sayHello(name)+" I am mary";return res;} }
-
在新建項目的src/test/java/com/etime/maven2中新建TestDemo02.java文件
package com.etime.maven1; import org.junit.Test; public class TestDemo2{@Testpublic void t01(){Demo2 d = new Demo2();String res = d.say("jack");System.out.println(res);} }
-
進入day02項目中pom.xml所在的位置,打開命令窗口分別執(zhí)行 mvn compile、mvn test-compile、mvn test
-
問題
- 這里project就是我們的第一個Maven工程,現(xiàn)在day02對它有依賴。那么這個依賴能否成功呢?更進一步的問題是:day02工程會到哪里去找project呢
- 回答:本地倉庫。任何一個Maven工程會根據(jù)坐標到本地倉庫中去查找它所依賴的jar包。如果能夠找到則可以正常工作,否則就不行。
(2)依賴管理
-
當A jar包需要用到B jar包中的類時,我們就說A對B有依賴。例如:commons-fileupload-1.3.jar依賴于commons-io-2.0.1.jar。
-
通過第二個Maven工程我們已經看到,當前工程會到本地倉庫中根據(jù)坐標查找它所依賴的jar包。
-
配置的基本形式是使用dependency標簽指定目標jar包的坐標。
<dependencies><dependency><!—坐標 --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- 依賴的范圍 --><scope>test</scope></dependency> </dependencies>
-
依賴的范圍
- compile
- main目錄下的Java代碼可以訪問這個范圍的依賴
- test目錄下的Java代碼可以訪問這個范圍的依賴
- 部署到Tomcat服務器上運行時要放在WEB-INF的lib目錄下
- 例如:對Demo1的依賴。主程序、測試程序和服務器運行時都需要用到。
- test
- main目錄下的Java代碼不能訪問這個范圍的依賴
- test目錄下的Java代碼可以訪問這個范圍的依賴
- 部署到Tomcat服務器上運行時不會放在WEB-INF的lib目錄下
- 對junit的依賴。僅僅是測試程序部分需要。
- provided
- main目錄下的Java代碼可以訪問這個范圍的依賴
- test目錄下的Java代碼可以訪問這個范圍的依賴
- 部署到Tomcat服務器上運行時不會放在WEB-INF的lib目錄下
- servlet-api在服務器上運行時,Servlet容器會提供相關API,所以部署的時候不需要。
- 其他:runtime、import、system等。
(3)依賴的傳遞性
- 如果A依賴B,B依賴C,那么A→B和B→C都是直接依賴,而A→C是間接依賴
- 當存在間接依賴的情況時,主工程對間接依賴的jar可以訪問嗎?這要看間接依賴的jar包引入時的依賴范圍——只有依賴范圍為compile時可以訪問。
(4)依賴的原則:解決jar包沖突
- 路徑最短者優(yōu)先
- 路徑相同時先聲明者優(yōu)先
- 這里“聲明”的先后順序指的是dependency標簽配置的先后順序。
(5)依賴的排除
- 當前工程為public,直接依賴environment。environment依賴commons-logging的1.1.1對于public來說是間接依賴。
- 當前工程public直接依賴commons-logging的1.1.2加入exclusions配置后可以在依賴environment的時候排除版本為1.1.1的commons-logging的間接依賴。
Environment工程:
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version>
</dependency>當前工程:
<dependency><groupId>com.etime.maven</groupId><artifactId>Environment</artifactId><version>0.0.1-SNAPSHOT</version><!-- 依賴排除 --><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.2</version>
</dependency>
(6)統(tǒng)一管理目標jar包的版本
-
以對Spring的jar包依賴為例:
- Spring的每一個版本中都包含spring-core、spring-context等jar包。我們應該導入版本一致的Spring jar包,而不是使用4.0.0的spring-core的同時使用4.1.1的spring-context。
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.0.0.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.0.0.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.0.0.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.0.0.RELEASE</version> </dependency>
-
問題是如果我們想要將這些jar包的版本統(tǒng)一升級為4.1.1,是不是要手動一個個修改呢?顯然,我們有統(tǒng)一配置的方式:
<properties><spring.version>4.1.1.RELEASE</spring.version> </properties> <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version> </dependency>
4、倉庫
(1) 本地倉庫
- 為當前本機電腦上的所有Maven工程服務。
(2) 遠程倉庫
- 私服:架設在當前局域網環(huán)境下,為當前局域網范圍內的所有Maven工程服務。
- 中央倉庫:架設在Internet上,為全世界所有Maven工程服務。
- 中央倉庫的鏡像:架設在各個大洲,為中央倉庫分擔流量。減輕中央倉庫的壓力,同時更快的響應用戶請求。
(3) 倉庫中文件
- Maven的插件
- 我們自己開發(fā)的項目的模塊
- 第三方框架或工具的jar包
- 注意:不管是什么樣的jar包,在倉庫中都是按照坐標生成目錄結構,所以可以通過統(tǒng)一的方式查詢或依賴。
5、生命周期
(1)maven的生命周期
- Maven生命周期定義了各個構建環(huán)節(jié)的執(zhí)行順序,有了這個清單,Maven就可以自動化的執(zhí)行構建命令了。
- maven有三套相互獨立的生命周期
- Clean Lifecycle在進行真正的構建之前進行一些清理工作。
- Default Lifecycle構建的核心部分,編譯,測試,打包,安裝,部署等等。
- Site Lifecycle生成項目報告,站點,發(fā)布站點。
- 它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運行 mvn clean install site 運行所有這三套生命周期。
- 生命周期分類
- clean生命周期:Clean Lifecycle 在進行真正的構建之前進行一些清理工作。Clean生命周期一共包含了三個階段
- pre-clean 執(zhí)行一些需要在clean之前完成的工作
- clean 移除所有上一次構建生成的文件
- post-clean 執(zhí)行一些需要在clean之后立刻完成的工作
- Default生命周期:是構建的核心部分,編譯,測試,打包,部署等等,Default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發(fā)生在這個生命周期中。
- compile 編譯項目的源代碼
- install 將包安裝至本地倉庫,以讓其它項目依賴。
- deploy 將最終的包復制到遠程的倉庫,以讓其它開發(fā)人員與項目共享
- process-test-resources 復制并處理資源文件,至目標測試目錄
- process-resources 復制并處理資源文件,至目標目錄,準備打包
- test-compile 編譯測試源代碼
- test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署
- package 接受編譯好的代碼,打包成可發(fā)布的格式,如 JAR,war
- Site生命周期(Site Lifecycle):生成項目報告,站點,發(fā)布站點,站點的文檔(站點信息,依賴…)。
- pre-site 執(zhí)行一些需要在生成站點文檔之前完成的工作
- site 生成項目的站點文檔
- post-site 執(zhí)行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
- site-deploy 將生成的站點文檔部署到特定的服務器上
- clean生命周期:Clean Lifecycle 在進行真正的構建之前進行一些清理工作。Clean生命周期一共包含了三個階段
7、繼承
(1)繼承機制
- 由于非compile范圍的依賴信息是不能在“依賴鏈”中傳遞的,所以有需要的工程只能單獨配置。此時如果項目需要將各個模塊的junit版本統(tǒng)一為4.9,那么到各個工程中手動修改無疑是非常不可取的。使用繼承機制就可以將這樣的依賴信息統(tǒng)一提取到父工程模塊中進行統(tǒng)一管理。
(2)繼承項目創(chuàng)建
-
創(chuàng)建父工程
-
創(chuàng)建子模塊
- 在父工程中new - module 創(chuàng)建子模塊(Java工程或者JavaWeb工程)
-
創(chuàng)建父工程和創(chuàng)建一般的Java工程操作一致,唯一需要注意的是:打包方式處要設置為pom。
-
在子模塊中引用父工程
<parent><!-- 父工程坐標 --><groupId>...</groupId><artifactId>...</artifactId><version>...</version><relativePath>從當前目錄到父項目的pom.xml文件的相對路徑</relativePath> </parent>
五、IDEA整合maven
1、創(chuàng)建Maven項目
2、創(chuàng)建Maven的JavaWeb項目
3、Maven配置
4、簡單測試
-
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><packaging>war</packaging><groupId>com.etime</groupId><artifactId>day02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- DBUtils --><dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.6</version></dependency><!-- 數(shù)據(jù)庫相關 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!--c3p0--><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies> </project>
-
Demo.java
package com.etime.demo;import org.apache.commons.dbutils.QueryRunner; import org.junit.Test;import java.sql.SQLException;public class StudentDemo {@Testpublic void t01() {//刪除學號為1的學生QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());String sql = "delete from student where sid=2";try {int rows = queryRunner.update(sql);System.out.println(rows);} catch (SQLException e) {e.printStackTrace();}} }
-
注意:c3p0的配置文件需要放到test中的resources文件夾中
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OiYbFKb0-1692059360442)(F:\Java語言\課程筆記\第六階段\myself\maven\img\testc3p0.png)]
-
.demo;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import java.sql.SQLException;
public class StudentDemo {
@Test
public void t01() {
//刪除學號為1的學生
QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());
String sql = “delete from student where sid=2”;
try {
int rows = queryRunner.update(sql);
System.out.println(rows);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 注意:c3p0的配置文件需要放到test中的resources文件夾中