Maven 自問自答

Maven 自問自答

Apache Maven,作爲一個項目管理和綜合的工具,說起來很尷尬,一直以來,我都是把他當成一個依賴管理的工具而已,方便的地方就是我不用到處找jar包。同時,我還把他和IDE工具緊密的依賴在一起,每次都是用IDE工具去生成maven,這樣看起來真的很糟糕,所以,寫這篇自問自答來補全一下知識。

maven有什麼用

maven作爲一個項目構建和管理的工具,提供了幫助管理、構建、文檔、報告、依賴、發佈、分發的方法,可以方便的編譯代碼、進行依賴管理、管理二進制庫等等,有利於項目過程的規範化、自動化、高效化、增強了可擴展性。

POM 是一個什麼東西

project object model ,項目對象模型。pom中包含了項目的信息和maven build項目所需要的配置信息,通常有項目信息、依賴、插件、goal、build等等。pom是可以被繼承的,因此有擴展性。

解讀pom

 <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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.chen</groupId>
    <artifactId>my_spring_boot</artifactId>
    <packaging>war</packaging>
    <name>my_spring_boot Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>0.5.0.BUILD-SNAPSHOT</version>
    </parent>

    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- Package as an executable JAR -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <!-- Allow access to Spring milestones and snapshots -->
    <!-- (you don't need this if you are using anything after 0.5.0.RELEASE) -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>
</project>

modelVersion:是object model版本,除非maven開發者升級版本,否則不需要修改。
groupId:指的是項目構建團體或組織唯一標識符,通常是域名倒寫。
artifactId:指的是項目名。
package:指的是打包方式:jar、war、ear等等,默認jar。
version artifact:通常是0.0.1-SNAPSHOT,開發版。
name:maven文檔中,目的展示名。
url:項目地址。
dependencies:依賴。
parent:父類的pom。
snapshot :快照倉庫。
pluginRepositories:插件倉庫。

Build Lifecycle

一個項目build的過程。maven的Build Lifecycle分爲三種,分別爲default(處理項目的部署)、clean(處理項目的清理)、site(處理項目的文檔生成)。他們都包含不同的lifecycle。

maven 三條指令運行web項目

  1. mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=packageName -DartifactId=webappName
    示例:
    mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.chen.web -DartifactId=my_maven

  2. cd my_maven

  3. mvn tomcat:run -Dmaven.tomcat.port=8080

maven常用指令

mvn compile:編譯源代碼
mvn test-compile:編譯測試代碼
mvn clean:清空
mvn test:運行測試
mvn package:打包項目
mvn install:安裝打包的jar到本地倉庫
mvn clean package:清楚target再打包

maven結構

my-app
|--pom.xml
|--src
    |--main
        |--java
            |--com
                |--mycompany
                    |--app
                        |--App.java
    |--test
        |--java
            |--com
                |--mycompany
                    |--app
                        |--AppTest.java

maven快照版是什麼

如果maven依賴都是release,那麼每次更新以來都是要更換版本才能下載,這樣就麻煩了,比如 你依賴的依賴是處於開發期中的,那麼每次他修改一次代碼(會很頻繁),就要升級一次版本,所以maven2推出了snapshot快照倉庫和release發佈倉庫。

dependency中的scope含義

maven打包的時候,是否進行打包。
-compile:默認範圍
-provided:說明jdk或容器已經提供這依賴
-runtime:運行和測試需要,編譯不需要
-test:測試需要
-system:和provided一樣

maven座標是什麼

座標就是maven構件的定位。比如說junit:junit:4.8.2表示的就是倉庫中的路徑/junit/junit/4.8.2/junit-4.8.2.pom和/junit/junit/4.8.2/junit-4.8.2.jar這個文件。

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
  <scope>test</scope>
</dependency>

version

<主版本>.<次版本>.<增量版本>-<限定符>

Classifier

   <dependency>
         <groupId>net.sf.json-lib</groupId>
         <artifactId>json-lib</artifactId>
         <version>2.4</version>
         <classifier>JDK15</classifier>
   </dependency>

定義version的版本

<dependency>
  <groupId>org.springframework</groupId>
  <artifactid>spring-beans</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactid>spring-context</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactid>spring-core</artifactId>
  <version>2.5</version>
</dependency>

以上代碼可改爲

<properties>
  <spring.version>2.5</spring.version>
</properties>
<depencencies>
  <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>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactid>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
</depencencies>

多模塊中統一一些依賴

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactid>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactid>log4j</artifactId>
      <version>1.2.16</version>
    </dependency>
  </dependencies>
</dependencyManagement>

子模塊就可以簡化成

<dependency>
    <groupId>junit</groupId>
    <artifactid>junit</artifactId>
  </dependency>
  <dependency>
    <groupId>log4j</groupId>
    <artifactid>log4j</artifactId>
  </dependency>

推薦學習鏈接

maven實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章