IDEA中使用Maven

Maven的安裝與使用

安裝

一、下載,官網下載html

二、解壓,存放路徑中不可包含空格和中文。如:"E:\dev\workspace\maven\apache-maven-3.6.0"java

三、配置本地倉庫,進入 "conf/settings.xml" 中,在 settings 節下開啓以下配置,該路徑就是指向本地倉庫的路徑:web

<localRepository>E:\dev\workspace\maven\repository</localRepository>

Maven 在查找 jar 時遵循什麼樣的順序呢?spring

  1. 優先在本地倉庫中查找。
  2. 若是本地倉庫中找不到,則從私服查找,找到後下載到本地倉庫。
  3. 若是私服中找不到,則從中央倉庫查找,找到後下載帶私服,最後下載到本地倉庫。

爲方便使用,這裏提供了已包含經常使用 jar 包的本地倉庫,點擊下載apache

三套生命週期

Maven 對項目構建過程分爲三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,這三套生命週期分別是:api

  1. Clean Lifecycle:在進行真正的構建以前進行一些清理工做。
  2. Default Lifecycle:構建的核心部分,如編輯、測試、打包、部署等等。
  3. Site Lifecycle:生成項目報告、站點、發佈站點。

每個階段都有一個對應的命令,且有相應的插件來支持命令的執行。tomcat

注:屬於同一個命令週期內的命令,當執行後面的命令時,前面的命令會自動執行。服務器

經常使用命令

  • complie:編譯命令,做用是將 'src/main/java' 下的 java 源文件編譯爲 class 文件並輸出到 target 下的 classes 目錄下。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn compile
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.763 s
    [INFO] Finished at: 2019-02-21T15:22:51+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • clean:清除命令,執行 clean 會刪除 target 目錄及其目錄下全部內容。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn clean
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ helloworld ---
    [INFO] Deleting F:\idea\0219\helloworld\target
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.359 s
    [INFO] Finished at: 2019-02-21T15:27:50+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • test:測試命令,會執行 'src/main/java' 下的單元測試類。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn test
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to F:\idea\0219\helloworld\target\test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.414 s
    [INFO] Finished at: 2019-02-21T15:36:20+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • package:打包命令,執行 package 命令對於 java 工程會打成 jar 包,對於 web 工程會打成 war 包。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn package
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to F:\idea\0219\helloworld\target\test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO]
    [INFO] --- maven-war-plugin:3.2.2:war (default-war) @ helloworld ---
    [INFO] Packaging webapp
    [INFO] Assembling webapp [helloworld] in [F:\idea\0219\helloworld\target\helloworld]
    [INFO] Processing war project
    [INFO] Copying webapp resources [F:\idea\0219\helloworld\src\main\webapp]
    [INFO] Webapp assembled in [44 msecs]
    [INFO] Building war: F:\idea\0219\helloworld\target\helloworld.war
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.752 s
    [INFO] Finished at: 2019-02-21T15:40:07+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • install:安裝命令,執行 install 會將項目打成 jar 或 war 包發佈到本地倉庫。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn install
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO]
    [INFO] --- maven-war-plugin:3.2.2:war (default-war) @ helloworld ---
    [INFO] Packaging webapp
    [INFO] Assembling webapp [helloworld] in [F:\idea\0219\helloworld\target\helloworld]
    [INFO] Processing war project
    [INFO] Copying webapp resources [F:\idea\0219\helloworld\src\main\webapp]
    [INFO] Webapp assembled in [43 msecs]
    [INFO] Building war: F:\idea\0219\helloworld\target\helloworld.war
    [INFO]
    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ helloworld ---
    [INFO] Installing F:\idea\0219\helloworld\target\helloworld.war to E:\dev\workspace\maven\repository\com\zze\helloworld\1.0-SNAPSHOT\helloworld-1.0-SNAPSHOT.war
    [INFO] Installing F:\idea\0219\helloworld\pom.xml to E:\dev\workspace\maven\repository\com\zze\helloworld\1.0-SNAPSHOT\helloworld-1.0-SNAPSHOT.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.544 s
    [INFO] Finished at: 2019-02-21T15:44:21+08:00
    [INFO] ------------------------------------------------------------------------
    例:

依賴管理

依賴的範圍

  • compile:編譯範圍,默認值

    compile 是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在全部的 classpath 中可用,同時它們也會被打包。app

  • provided:已提供範圍

    provided 依賴只有在當 JDK 或者一個容器已提供該依賴以後才使用。例如, 若是你開發了一個 web 應用,你可能在編譯 classpath 中須要可用的 Servlet API 來編譯一個 Servlet,可是你不會想要在打包好的 war 中包含這個 Servlet API;這個 Servlet API JAR 由你的應用服務器或者 Servlet 容器提供。已提供範圍的依賴在編譯 classpath (不是運行時)可用。它們不是傳遞性的,也不會被打包。webapp

  • runtime:運行時範圍

    runtime 依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你可能在編譯的時候只須要 JDBC API JAR,而只有在運行的時候才須要 JDBC 驅動實現。

  • test:測試範圍

    test 範圍依賴在通常的編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。

  • system:系統範圍

    system 範圍依賴與 provided 相似,可是你必須顯式的提供一個對於本地系統中JAR 文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven 也不會在倉庫中去尋找它。若是你將一個依賴範圍設置成系統範圍,你必須同時提供一個 systemPath 元素。注意該範圍是不推薦使用的(你應該一直儘可能去從公共或定製的 Maven 倉庫中引用依賴)。

依賴的傳遞

參考工程的繼承與聚合,它其實就是使用依賴的傳遞來實現的。

排除依賴

建立工程,引入 'struts2-core' 依賴:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.37</version>
        </dependency>
    </dependencies>

</project>

pom.xml

假如咱們不想使用傳遞進來的 'javassist',那麼咱們能夠經過配置將其排除:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.37</version>
            <exclusions>
                <exclusion>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

pom.xml

路徑近者優先

建立工程,引入'struts2-spring-plugin' 依賴:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.37</version>
        </dependency>
    </dependencies>

</project>

pom.xml

接着引入 'spring-beans' 的依賴:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.37</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
    </dependencies>

</project>

pom.xml

此時會發現 'spring-beans' 的版本爲下面直接聲明的版本,由於它是直接引入,相對傳進進來路徑更近。

第一聲明者優先

建立工程,引入 'struts2-spring-plugin' 依賴:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.37</version>
        </dependency>
    </dependencies>

</project>

pom.xml

接着引入 'spring-context' 依賴:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.37</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
    </dependencies>

</project>

pom.xml

此時會發現 'spring-beans' 的版本依舊是 'struts2-spring-plugin' 傳遞進來的,由於 'struts2-spring-plugin' 是先聲明的。

交換 'struts2-spring-plugin' 和 'spring-context' 依賴的聲明順序:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.37</version>
        </dependency>

    </dependencies>

</project>

pom.xml

此時 'spring-beans' 的版本就改成 'spring-context' 傳遞進來的版本了,由於 'spring-context' 是先聲明的。

版本鎖定

版本鎖定通常在父子工程間使用,建立父工程 A,鎖定 'spring-beans' 的版本:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>../B</module>
    </modules>
    <dependencyManagement>
        <!--dependencyManagement 下的 dependencies 節只是用來預先鎖定指定依賴的版本,並不會真的引入依賴-->
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
pom.xml [A]

建立子工程 B ,繼承父工程 A,引入 'spring-beans' 依賴:

<?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">
    <parent>
        <artifactId>A</artifactId>
        <groupId>com.zze</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../A/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>B</artifactId>
    <dependencies>
        <!--由於在父工程中已經鎖定了 spring-beans 的版本,因此在子工程中不用指定版本-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
    </dependencies>
</project>
pom.xml [B]

由於在父工程中已經鎖定了 'spring-beans' 的版本,因此在子工程中不指定版本會默認引用父工程鎖定的版本。

版本常量使用

建立工程,建立版本常量,在依賴中引用版本常量:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <!--建立版本常量-->
        <spring.version>4.2.4.RELEASE</spring.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <!--引用版本常量-->
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
pom.xml

工程的繼承與聚合

繼承

建立一個父工程 A,再建立一個子工程 B 繼承 A:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>../B</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.37</version>
        </dependency>
    </dependencies>
</project>
pom.xml [A]
 <?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">
    <parent>
        <artifactId>A</artifactId>
        <groupId>com.zze</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../A/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>B</artifactId>

</project>
pom.xml [B]

A 的 依賴會傳遞給B,此時就能夠直接在子工程 B 中使用父工程 A 依賴了,這就是工程的繼承。

聚合

建立工程 A,再建立工程 B 依賴工程 A:

<?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.zze</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.37</version>
        </dependency>
    </dependencies>
</project>
pom.xml [A]
<?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.zze</groupId>
    <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.zze</groupId>
            <artifactId>A</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
pom.xml [B]

此時 A 的依賴會傳遞給 B ,在工程 B 就能夠直接使用工程 A 引入的依賴了,這就是工程的聚合。

IDEA中使用Maven

配置

一、快捷鍵 CTRL+ALT+S 打開 IDEA 設置,配置 Maven 地址:

二、在 Importing 頁中勾選如圖項:

三、配置 Runner 頁中屬性 '-DarchetypeCatalog=internal',防止未聯網狀況不能建立 Maven 工程。

建立工程

建立java工程

一、新建項目,選中 Maven,直接 Next:

二、輸入座標,再次 Next:

三、直接 Finish:

四、建立完成,編寫代碼測試:

建立web工程

一、新建項目,選中 Maven,如圖選擇 web 工程骨架,Next:

二、選擇本身配置的 Maven 目錄,Next:

三、直接 Finish:

四、輸出如圖則建立成功:

web項目的運行

準備

下面以運行一個 HelloWorld 程序爲例:

一、新建 web 項目,在 'src/main' 下 java 建立文件夾,並標記其爲 Sources Root 文件夾,執行完這個操做後 java 文件夾就至關於普通工程的 classpath 根目錄了。

二、在 pom 文件中引入 Servlet 開發依賴 jar:

<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>

注意:由於 maven  web 工程後續運行時使用 maven 提供的 tomcat 環境,這裏要設置引入 jar 的 scope 爲 provided,不然會由於 jar 包重複出異常。

三、在 'src\main\java' 下建立 Servlet 以下:

package com.zze.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("Hello world!!!");
    }
}
com.zze.servlet.HelloServlet
<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.zze.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
WEB-INF/web.xml

運行方式一:命令運行

一、打開 MavenProjects 窗口:

二、點擊如圖按鈕:

三、輸入 'tomcat:run' 指令,Execute:

四、此時項目就以被部署到 tomcat 並運行:

五、訪問 'localhost:8080/helloworld/hello' 測試:

運行方式二:配置運行

一、進入 Edit Configurations:

二、選擇 Maven:

三、輸入以下,Apply:

四、此時就可直接點擊該圖標啓動項目了:

五、還可在 Maven Projects 窗口中雙擊該配置啓動:

運行方式三:本地Tomcat運行

一、進入 Edit Configurations:

二、選擇 Tomcat 下的 Local 項:

三、選擇 Deployment 欄,點擊 + 號:

三、選擇 Artifact:

四、選擇 war exploded 結尾項:

五、OK,接下來就能夠像運行普通 web 工程同樣啓動 maven 項目:

補充

配置國內倉庫源

在 "conf/settings.xml" 文件中的 mirrors 節下選下面一個節點添加便可:

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>        
</mirror>
阿里雲
<mirror>
    <id>jboss-public-repository-group</id>
    <mirrorOf>central</mirrorOf>
    <name>JBoss Public Repository Group</name>
    <url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
jboss

配置Tomcat插件

<!--使用 tomcat7:run-->
<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <port>8080</port>
    <path>/</path>
  </configuration>
</plugin>

聚合工程整合SSH示例

點擊下載

IDEA建立Maven工程經常使用骨架

下面是我習慣使用的骨架:

建立普通 java 工程:不使用骨架;

建立父工程:maven-archetype-site-simple;

建立 web 工程:maven-archetype-webapp;

相關文章
相關標籤/搜索