主頁 > 後端開發 > Maven 初學+http://mvnrepository.com/

Maven 初學+http://mvnrepository.com/

2020-09-11 07:00:12 後端開發

了解

maven是一款服務于java平臺的自動化構建工具(專案管理工具)

構建:全方位、多角度、深層次地建立

專案構建是一個專案從:源代碼、編譯、測驗、打包、部署、運行的程序

用來解決團隊開發遇到的問題
如: 統一 jar包 統一組態檔,單元測驗 的代碼位置即 目錄結構的統一

傳統的專案構建程序

1)在eclipse中創建一個java web工程
2)在工程中撰寫源代碼及組態檔等
3)對源代碼進行編譯,java檔案編譯成class檔案
4)執行Junit單元測驗
5)將工程打成war包部署至tomcat運行

maven專案 構建程序

maven將項目構建的程序進行標準化,每個階段使用一個命令完成

在這里插入圖片描述

優點:

  1. 一個命令完成構建、運行,方便快捷,
  2. maven對每個構建階段進行規范,非常有利于大型團隊協作開發,

1.3 什么是依賴管理

什么是依賴?一個java專案可能要使用一些第三方的jar包才可以運行,那么我們說這個java專案依賴了這些第三方的jar包,

什么是依賴管理?就是對專案所有依賴的jar包進行規范化管理,

在這里插入圖片描述
在這里插入圖片描述

總結使用maven的好處

  1. 一步構建 命令執行,標準化
  2. 依賴管理 安全又方便
  3. 跨平臺 電腦 手機都可用
  4. 團隊開發 有規程 效率高,成本低 大家都喜歡用它

核心檔案pom.xml

<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.xrq.withmaven</groupId>
  <artifactId>withmaven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build/>
</project>

1、modelVersion

指定了當前Maven模型的版本號,對于Maven2和Maven3來說,它只能是4.0.0

2、groupId

顧名思義,這個應該是公司名或是組織名,一般來說groupId是由三個部分組成,每個部分之間以".“分隔,第一部分是專案用途,比如用于商業的就是"com”,用于非營利性組織的就  是"org";第二部分是公司名, 如"tengxun"、“baidu”、“alibaba”;第三部分是你的專案名

3、artifactId

可以認為是Maven構建的專案名,比如你的專案中有子專案,就可以使用"專案名-子專案名"的命名方式

4、version

版本號,SNAPSHOT意為快照,說明該專案還在開發中,是不穩定的版本,在Maven中很重要的一點是,groupId、artifactId、version三個元素生成了一個Maven專案的基本坐標,這非常重要,我在使用和研究Maven的時候多次感受到了這點,

在上面的這些元素之外,還有一些元素,同樣羅列一下:

1、packing

專案打包的型別,可以使jar、war、rar、ear、pom,默認是jar

2、dependencies和dependency

前者包含后者,前面說了,Maven的一個重要作用就是統一管理jar包,為了一個專案可以build或運行,專案中不可避免的,會依賴很多其他的jar包,在Maven中,這些依賴就被稱為dependency,

本地倉庫和遠程倉庫的概念 如下
* 本地倉庫   
* 遠程倉庫
     * 中央倉庫
     * 私服  //自己的架構包 放在上面
     * 其他公共庫  //別人的

本地倉庫 執行maven命令時才創建

maven 本地儲存的位置,有很多架構包

官方下載的本地倉庫的配置在"%MAVEN_HOME%\conf\settings.xml"里面,找一下"localRepository"就可以了;
在這里插入圖片描述
setting.xml:

改兩個地方

  1. 確定 本地倉庫位置
<localRepository>E:\maven\repository</localRepository>
  1. 為了提高下載速度而 配置的阿里云鏡像
<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

在這里插入圖片描述

MyEclipse默認的本地倉庫的地址在**"{user.home}/.m2/repository"路徑下**,同樣找一下"localRepository"就可以找到MyEclipse默認的本地倉庫了,

在這里插入圖片描述

安裝 配置環境

首先去Maven官網,下載Maven的包,地址為http://maven.apache.org/download.cgi,找到下面的部分,點擊就可以下載

將maven解壓到一個不含有中文和空格的目錄中,

  • bin目錄 mvn.bat (以run方式運行專案)、 mvnDebug.bat(以debug方式運行專案 )

  • boot目錄 maven運行需要類加載器

  • conf目錄 settings.xml 整個maven工具核心組態檔

  • lib目錄 maven運行依賴jar包
    在這里插入圖片描述

  • 電腦上需安裝java環境,安裝JDK1.7 + 版本 (將JAVA_HOME/bin 配置環境變數path )
    配置 MAVEN_HOME

  • %MAVEN_HOME%/bin 加入環境變數 path
    在這里插入圖片描述

  • mvn -v命令檢查 maven是否安裝成功

在這里插入圖片描述

在這里插入圖片描述

maven倉庫的作用

本地倉庫和遠程倉庫是這樣的,Maven工程首先會從本地倉庫中獲取jar包,當無法獲取指定jar包時,本地倉庫會從遠程倉庫(中央倉庫)中下載jar包,并放入本地倉庫以備將來使用,
在這里插入圖片描述
優先從本地倉庫查找
默認本地倉庫位置在 user.dir/.m2/repository{user.dir}/.m2/repository,{user.dir}表示windows用戶目錄,

遠程倉庫

如果本地需要插件或者jar包,本地倉庫沒有,默認去遠程倉庫下載,
遠程倉庫可以在互聯網內也可以在局域網內,

在這里插入圖片描述

中央倉庫

在maven軟體中內置一個遠程倉庫地址http://repo1.maven.org/maven2 ,它是中央倉庫,服務于整個互聯網,它是由Maven團隊自己維護,里面存盤了非常全的jar包,它包含了世界上大部分流行的開源專案構件,

定義maven坐標

每個maven工程都需要定義本工程的坐標,坐標是maven對jar包的身份定義,比如:入門程式的坐標定義如下:

<!--專案名稱,定義為組織名+專案名,類似包名-->
<groupId>cn.atcast.maven</groupId>

<!-- 模塊名稱 -->
<artifactId>maven-first</artifactId>
<!-- 當前專案版本號,snapshot為快照版本即非正式版本,release為正式發布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包型別
	jar:執行package會打成jar包
	war:執行package會打成war包
	pom :用于maven工程的繼承,通常父工程設定為pom 

第一個maven

需求

創建一個web工程,實作入門程式的功能,
1)添加index.jsp,輸出hello world
2)添加一個servlet轉發到jsp頁面,

① 創建約定的目錄結構(maven工程必須按照約定的目錄結構創建)

根目錄:工程名
|—src:原始碼
|—|---main:存放主程式
|—|---|—java:java原始碼檔案
|—|---|—resource:存放框架的組態檔
|—|---test:存放測驗程式
|—pop.xml:maven的核心組態檔
我們按照上面的檔案夾目錄結構手動創建一下,不用任何IDE環境(手動的其實最有助于我們理解maven)
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

出錯:

在這里插入圖片描述
在這里插入圖片描述
專案的結構 也不對 檢查配置 和setting.xml 是否出錯

pom.xml報錯

缺少 web.xml----aa\src\main\webapp\WEB-INF

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
    <servlet>
    <description></description>
    <display-name>HelloServlet</display-name>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>cn.atcast.web.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>
   
</web-app>

NewFile.xml報錯 (新建一個xml 顯示123123)

在這里插入圖片描述

解決:
1.
在這里插入圖片描述
2.
在這里插入圖片描述
3. pom.xml 包配置+ 添加servelt/jsp的包

<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
			<scope>test</scope>
		</dependency>

	</dependencies>

目錄

在這里插入圖片描述

問題解決 后 讓他跑起來吧
–>Run As

案例二:

①、配置

選擇選單windows–>preferences(引數)–>maven

在這里插入圖片描述
選擇Installations(安裝),添加你自己下載并解壓好的maven目錄,并打上對勾 √,點擊Apply(應用)

再選擇User Settings目錄,在User Settings中選擇Browse(瀏覽),選擇你自己maven里的conf下的settings.xml檔案,

在這里插入圖片描述
插一句:settings.xml這個組態檔,主要是配置你本地倉庫的路徑的,不想使用默認路徑,就打開檔案,加上自己的路徑配置,

**<localRepository>C:Program FilesJavarepository</localRepository>
到此,maven整個的設定就OK了,**

專案就創建完成后,但是jdk的版本還有sevlet-api等jar包還沒有

在這里插入圖片描述

選擇創建好的工程單擊右鍵,選擇properties 并找到 Java Build Path,把jdk的版本選擇你電腦上的正確的jdk版本,

在這里插入圖片描述

選擇創建好的工程單擊右鍵,選擇properties 并找到 Project Facets,版本選擇3.1,下面的java版本選擇1.8,點擊Apply

在這里插入圖片描述
選擇創建好的工程單擊右鍵,找到build path

在這里插入圖片描述
找到Libaries,添加Tomcat8.5的依賴庫,點擊OK
在這里插入圖片描述

錯誤解決

1.手動安裝Eclipse maven-archetype-quickstart
下載
C:\Users\DELL
然后從CMD里手動安裝,

mvn install:install-file -DgroupId=org.apache.maven.archetypes -DartifactId=maven-archetype-quickstart -Dversion=X.X -Dpackaging=jar -Dfile=maven-archetype-quickstart-1.1.jar

在這里插入圖片描述
2
在這里插入圖片描述
解決一:
在這里插入圖片描述
解決二:
在這里插入圖片描述

案例三(創建一個service)

我們在之前(案例一)的基礎上 在web.xml檔案 配置一下

    <servlet>
    <description></description>
    <display-name>HelloServlet</display-name>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>cn.atcast.web.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

在這里插入圖片描述
Run As---->Maven build

在這里插入圖片描述

POM檔案內容:(重點)

定義:

pom: 專案物件模型 ,是一個 XML 檔案 包含了物件是 使用maven來構建 ,每個專案只有一個pom.xml檔案

概念:父POM 類似Object類
在這里插入圖片描述

<?xml version="1.0" ?>
<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.hzg.maven</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPSHOT</version> 工程版本號

    <name>Hello</name>
   <url>http://maven.apache.org</url>

project:工程的根標簽
modelVersion:pom模板版本
groupId:組織標識 (一般唯一)
artifactId:工程名稱
packaging:打包方式:JAR ,WAR ,EAR 三種

//依賴配置資訊
 <dependencies>
            <dependency>
                         <groupId>junit</groupId>
                         <artifactId>junit</artifactId>
                         <version>4.0</version>
                         <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
<build>
    <finalName>WebMavenDem</finalName>
</build>
</project>

parnt 父專案的資訊

modules 模塊

properties 定義pom變數 類似 int a;

dependencyManageMent 有多模塊時,統一子專案使用依賴項的同一版本 ,同時有了父模塊后 ,子模塊 就不會優先參考對應依賴 .同時 修改時 也只要改父類就可以了.

在這里插入圖片描述

常用maven命令

在這里插入圖片描述

執行maven命令必須進入到pom.xml的目錄中進行執行
在這里插入圖片描述
進入到專案的pom.xml目錄之后,就可以執行啦,

1、運行 mvn compile
在這里插入圖片描述

OK,運行完畢,你在pom.xml配置的依賴的包已經匯入到倉庫了,問題來了,倉庫默認的位置在哪?

倉庫的默認位置:c:Usrs[登錄當前系統的用戶名].m2repository

剛才執行完compile之后,之前的檔案夾發生了變化
在這里插入圖片描述

我們發現Hello專案里里多了一個target檔案夾,檔案夾的內容為:
在這里插入圖片描述

發現target里主要存放的就是編譯后的位元組碼檔案

2、運行mvn test-compile,target檔案夾下面除了classes之外多了test-classes檔案夾

3、運行mvn package,target檔案夾下面又多了一個打好的jar包

在這里插入圖片描述
4、運行mvn clean,發現整個target檔案夾都沒了,又回到了編譯之前我們手動創建的檔案夾

五、倉庫和坐標

pom.xml:Project Object Model 專案物件模型,它是maven的核心組態檔,所有的構建的配置都在這里設定,

② 坐標:使用下面的三個向量在倉庫中唯一的定位一個maven工程
在這里插入圖片描述
< packaging > :打包型別
jar:執行package會打成jar包
war:執行package會打成war包
pom :用于maven工程的繼承,通常父工程設定為pom

③ maven工程的坐標與倉庫中路徑的關系:
在這里插入圖片描述

maven坐標和倉庫對應的映射關系:[ groupId ] [ artifactId ][version][artifactId]-[version].jar

去本地倉庫看一下此目錄:orgspringframeworkspring-core4.3.4.RELEASEspring-core-4.3.4.RELEASE.jar
果然是完全對應的

<project > :檔案的根節點 .
<modelversion > : pom.xml使用的物件模型版本
<groupId > :專案名稱,一般寫專案的域名
<artifactId > :模塊名稱,子專案名或模塊名稱
<version > :產品的版本號 . 
<packaging > :打包型別,一般有jar、war、pom 等 
<name > :專案的顯示名,常用于 Maven 生成的檔案,  
<description > :專案描述,常用于 Maven 生成的檔案
<dependencies> :專案依賴構件配置,配置專案依賴構件的坐標
<build> :專案構建配置,配置編譯、運行插件等,

六、依賴

① maven決議依賴資訊時會到本地倉庫中取查找被依賴的jar包

對于本地倉庫中沒有的會去中央倉庫去查找maven坐標來獲取jar包,獲取到jar之后會下載到本地倉庫
對于中央倉庫也找不到依賴的jar包的時候,就會編譯失敗了

② 如果依賴的是自己或者團隊開發的maven工程,需要先使用install命令把被依賴的maven工程的jar包匯入到本地倉庫中

舉例:現在我再創建第二個maven工程HelloFriend,其中用到了第一個Hello工程里類的sayHello(String name)方法,我們在給HelloFriend專案使用 mvn compile命令進行編譯的時候,會提示缺少依賴Hello的jar包,怎么辦呢?

到第一個maven工程中執行 mvn install后,你再去看一下本地倉庫,你會發現有了Hello專案的jar包,一旦本地倉庫有了依賴的maven工程的jar包后,你再到HelloFriend專案中使用 mvn compile命令的時候,可以成功編譯

③ 依賴范圍

在這里插入圖片描述
在這里插入圖片描述
scope就是依賴的范圍

七、生命周期

Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命周期看成一個整體,其實不然,這三套生命周期分別是:

Clean Lifecycle 在進行真正的構建之前進行一些清理作業,Clean生命周期一共包含了三個階段:

pre-clean 執行一些需要在clean之前完成的作業
clean 移除所有上一次構建生成的檔案
post-clean 執行一些需要在clean之后立刻完成的作業

Default Lifecycle 構建的核心部分,編譯,測驗,打包,部署等等,

validate 驗證工程是否正確(編譯)
generate-sources
process-resources 復制并處理資源檔案,至目標目錄,準備打包
compile 編譯專案的源代碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 復制并處理資源檔案,至目標測驗目錄
test-compile 編譯測驗源代碼
process-test-classes
test 使用合適的單元測驗框架運行測驗,這些測驗代碼不會被打包或部署
prepare-package
package 接受編譯好的代碼,打包成可發布的格式,
pre-integration-test
integration-test
post-integration-test
verify 運行所有檢查,驗證包是否有效
install 將包安裝至本地倉庫,以讓其它專案依賴,
deploy 將最終的包復制到遠程的倉庫,以讓其它開發人員與專案共享

那我們在Hello的專案中執行 mvn install 命令,通過日志看看中間經歷了什么?

在這里插入圖片描述
通過日志我們發現,其實執行mvn install,其中已經執行了compile 和 test ,

總結:不論你要執行生命周期的哪一個階段,maven都是從這個生命周期的開始執行
插件:每個階段都有插件(plugin),看上面標紅的,插件的職責就是執行它對應的命令,

Site Lifecycle 生成專案報告,站點,發布站點,

pre-site 執行一些需要在生成站點檔案之前完成的作業
site 生成專案的站點檔案
post-site 執行一些需要在生成站點檔案之后完成的作業,并且為部署做準備
site-deploy 將生成的站點檔案部署到特定的服務器上

九、maven工程的依賴高級特性

① 依賴的傳遞性

在這里插入圖片描述
WebMavenDemo專案依賴JavaMavenService1 JavaMavenService1專案依賴JavaMavenService2

pom.xml檔案配置好依賴關系后,必須首先mvn install后,依賴的jar包才能使用,

WebMavenDemo的pom.xml檔案想能編譯通過,JavaMavenService1必須mvn install
JavaMavenService的pom.xml檔案想能編譯通過,JavaMavenService2必須mvn install
傳遞性:

在這里插入圖片描述

在Eclipse中,為JavaMavenService2中增加了一個spring-core.jar包后,會驚喜的發現依賴的兩個專案都自動的增加了這個jar包,這就是依賴的傳遞性,

注意:非compile范圍的依賴是不能傳遞的,
② 依賴版本的原則:

1、路徑最短者優先原則

在這里插入圖片描述

Service2的log4j的版本是1.2.7版本,Service1排除了此包的依賴,自己加了一個Log4j的1.2.9的版本,那么WebMavenDemo專案遵守路徑最短優先原則,Log4j的版本和Sercive1的版本一致,

2、路徑相同先宣告優先原則
在這里插入圖片描述

這種場景依賴關系發生了變化,WebMavenDemo專案依賴Sercive1和Service2,它倆是同一個路徑,那么誰在WebMavenDemo的pom.xml中先宣告的依賴就用誰的版本,

③ 統一管理依賴的版本:

在這里插入圖片描述
為了統一管理版本號,可以使用properties標簽,里面可以自定義版本的標簽名,在使用的地方使用${自定義標簽名}

build配置

<build>
  <!-- 專案的名字 -->
  <finalName>WebMavenDemo</finalName>
  <!-- 描述專案中資源的位置 -->
  <resources>
    <!-- 自定義資源1 -->
    <resource>
      <!-- 資源目錄 -->
      <directory>src/main/java</directory>
      <!-- 包括哪些檔案參與打包 -->
      <includes>
        <include>**/*.xml</include>
      </includes>
      <!-- 排除哪些檔案不參與打包 -->
      <excludes>
        <exclude>**/*.txt</exclude>
          <exclude>**/*.doc</exclude>
      </excludes>
    </resource>
  </resources>
  <!-- 設定構建時候的插件 -->
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <!-- 源代碼編譯版本 -->
        <source>1.8</source>
        <!-- 目標平臺編譯版本 -->
        <target>1.8</target>
      </configuration>
    </plugin>
    <!-- 資源插件(資源的插件) -->  
    <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-resources-plugin</artifactId>  
      <version>2.1</version>  
      <executions>  
        <execution>  
          <phase>compile</phase>  
        </execution>  
      </executions>  
      <configuration>  
        <encoding>UTF-8</encoding>  
      </configuration> 
    </plugin>
    <!-- war插件(將專案打成war包) -->  
    <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-war-plugin</artifactId>  
      <version>2.1</version>  
      <configuration>
        <!-- war包名字 -->  
        <warName>WebMavenDemo1</warName>
      </configuration>  
    </plugin>  
  </plugins>
</build>

在這里插入圖片描述
配置好build后,執行mvn package之后,在maven工程指定的target目錄里war包和檔案都按照配置的生成了

加入第三方架包
在這里插入圖片描述

Maven私服

  1. 問題:專案組撰寫了一個通用的工具類,其它專案組將類拷貝過去使用,當工具類修改bug后通過郵件發送給各各專案組,這種分發機制不規范可能導致工具類版本不統一,

解決方案:專案組將寫的工具類通過maven構建,打成jar,將jar包發布到公司的maven倉庫中(私服),公司其它專案通過maven依賴管理從倉庫自動下載jar包,

私服(用于jar的發布 和下載)

  1. 公司在自己的局域網內搭建自己的遠程倉庫服務器,稱為私服私服服務器即是公司內部的maven遠程倉庫,每個員工的電腦上安裝maven軟體并且連接私服服務器,員工將自己開發的專案打成jar并發布到私服服務器,其它專案組從私服服務器下載所依賴的構件(jar),

  2. 私服還充當一個代理服務器,當私服上沒有jar包會從互聯網中央倉庫自動下載

在這里插入圖片描述

依賴版本沖突

依賴版本沖突:當一個專案依賴的構件比較多時,它們相互之前存在依賴,當你需要對依賴版本統一管理時如果讓maven自動來處理可能并不能如你所愿,如下例子:
(傳遞依賴:當A 依賴B、B依賴C,在A中匯入B后會自動匯入C,C是A的傳遞依賴,如果C依賴D則D也可能是A的傳遞依賴,)

<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 -->
  	<dependency>
  		<groupId>org.apache.struts</groupId>
  		<artifactId>struts2-spring-plugin</artifactId>
  		<version>2.3.24</version>
  	</dependency>
<!-- spring-context依賴spring-beans-4.2.4 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>4.2.4.RELEASE</version>
  	</dependency>

org.apache.struts依賴spirng-beans-3.0.5,spring-context依賴spring-beans-4.2.4,但是發現spirng-beans-3.0.5加入到工程中,而我們希望spring-beans-4.2.4加入工程,

依賴調解原則

maven自動按照下邊的原則調解:

宣告者優先原則
在pom檔案定義依賴,先宣告的依賴為準,

測驗:
如果將上邊struts-spring-plugins和spring-context順序顛倒,系統將匯入spring-beans-4.2.4,
分析:
由于spring-context在前邊,以spring-context依賴的spring-beans-4.2.4為準,所以最終spring-beans-4.2.4添加到了工程中,

排除依賴

上邊的問題也可以通過排除依賴方法輔助依賴調解,如下:
比如在依賴struts2-spring-plugin的設定中添加排除依賴,排除spring-beans,
下邊的配置表示:依賴struts2-spring-plugin,但排除struts2-spring-plugin所依賴的

spring-beans,

<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 -->
<dependency>
	<groupId>org.apache.struts</groupId>
	<artifactId>struts2-spring-plugin</artifactId>
	<version>2.3.24</version>
	<!-- 排除 spring-beans-->
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</exclusion>
	</exclusions>
</dependency>

鎖定版本

面對眾多的依賴,有一種方法不用考慮依賴路徑、宣告優化等因素可以采用直接鎖定版本的方法確定依賴構件的版本,版本鎖定后則不考慮依賴的宣告順序或依賴的路徑,以鎖定的版本的為準添加到工程中,此方法在企業開發中常用,
首先父工程中pom.xml檔案添加
如下的配置是鎖定了spring-beans和spring-context的版本:

在這里插入圖片描述

最后推薦個最新最全的maven依賴項版本查詢網站:

http://mvnrepository.com/


  1. 創建 maven maven-archetype-quickstart 專案抱錯問題解決方法

  2. Archetype,骨架的意思,
    文章出處:http://m.blog.csdn.net/blog/FireOfStar/42526027
    Archetype是什么?
    簡單的說,Archetype是Maven工程的模板工具包,一個Archetype定義了要做的相同型別事情的初始樣式或模型,這個名稱給我們提供來了一個一致的生成Maven工程的方式,Archetype會幫助作者給用戶創建Maven工程模板,并給用戶提供生成相關工程模板版本的引數化方法,
    使用Archetype提供的好的方法,是開發者能夠使用最佳實踐來快速的構建和組織一致化的工程,在Maven工程中,我們努力使用Archetype來盡可能快的給用戶提供示例工程,同時也會把Maven的最佳實踐介紹給新的用戶,一個新的用戶可以使用作業中的Maven作業作為跳板來研究更過的Maven中功能,我們也可以使用Archetype的添加機制,這樣就意味著允許我們抓取Archetype中專案片段,并把它們添加到既存的工程中,Maven網站的Archetype就是很好的例子,例如,你可以使用“quick start archetype”來生成一個工程,然后就可以通過其中既存的“site archetype”來快速的創建一個網址工程,你能夠使用Archetype來做很多這樣的事情,
    在你的團隊中可能想要標準化的J2EE開發,這需要你提供EJBs、或者是WARs、或者是Web services的原型,一旦在你團隊資源庫中創建和部署這些原型,它們就可以在你團隊內共享使用,
    如何使用Archetype
    要基于Archetype來創建一個新的工程,需要像下面示例這樣來呼叫:

mvn archetype:generate

已有的Archetypes

Archetype ID

說明

maven-archetype-archetype

一個樣例原型

maven-archetype-j2ee-simple

簡單的J2EE應用程式樣例

maven-archetype-mojo

Maven插件樣本的示例

maven-archetype-plugin

Maven插件樣本

maven-archetype-plugin-site

Mave插件網站的樣例

maven-archetype-portlet

JSR-268門戶樣例

maven-archetype-quickstart

Maven工程樣例

maven-archetype-simple

一個簡單的Maven工程

maven-archetype-site

Maven網站的樣例,它演示了對諸如APT、XDoc和FML等檔案型別的支持,并演示了如果把網站國際化(i18n)

maven-archetype-site-simple

Maven網站樣例

maven-archetype-webapp

Maven的Webapp工程樣例

常用Archetype
1,maven-archetype-quickstart
默認的Archetype,基本內容包括:
一個包含junit依賴宣告的pom.xml
src/main/java主代碼目錄及一個名為App的類
src/test/java測驗代碼目錄及一個名為AppTest的測驗用例

2,maven-archetype-webapp
一個最簡單的Maven war專案模板,當需要快速創建一個Web應用的時候可以使用它,生成的專案內容包括:
一個packaging為war且帶有junit依賴宣告的pom.xml
src/main/webapp/目錄
src/main/webapp/index.jsp檔案
src/main/webapp/WEB-INF/web.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.alipay.test</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>test</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>com.alipay.sdk</groupId>
      <artifactId>alipay-sdk-java</artifactId>
      <version>3.0.0</version>
      <exclusions>
        <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>
    <dependency>
      <groupId>commons-configuration</groupId>
      <artifactId>commons-configuration</artifactId>
      <version>1.10</version>
      <exclusions>
        <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.11</version>
    </dependency>
    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>core</artifactId>
      <version>3.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
      <version>1.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
    </dependency>


  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/4691.html

標籤:java

上一篇:flink 1.9.0 編譯:flink-fs-hadoop-shaded 找不到

下一篇:小白必看:合理搭建巨量引擎賬戶結構要點總結!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more