天天看點

maven學習随筆

    Apache Maven,是一個軟體(特别是java軟體)項目及自動建構工具,由Apache軟體基金會所提供。基于項目對象模型(縮寫:POM)概念,Maven利用一個中央資訊片斷能管理一個項目的建構、測試報告和文檔等。

     maven有規定好的目錄結構,項目必須嚴格遵從。一個 maven 項目在預設情況下會産生 JAR 檔案,另外 ,編譯後 的 classes 會放在 ${basedir}/target/classes 下面, JAR 檔案會放在${basedir}/target 下面。

目錄

作用

${basedir}

存放 pom.xml和所有的子目錄

${basedir}/src/main/java

項目的 java源代碼

${basedir}/src/main/resources

項目的資源,比如說 property檔案

${basedir}/src/test/java

項目的測試類,比如說 JUnit代碼

${basedir}/src/test/resources

測試使用的資源

        一,maven配置檔案

        全局配置檔案:{installed_dir}/conf/settings.xml

        優先級更高的配置檔案:${user.home}/.m2/settings.xml

        二,maven本地和遠端倉庫

        本地倉庫是遠端倉庫的一個緩沖和子集,當你建構Maven項目的時候,首先會從本地倉庫查找資源,如果沒有,那麼Maven會從遠端倉庫下載下傳到你本地倉庫。這樣在你下次使用的時候就不需要從遠端下載下傳了。如果你所需要的jar包版本在本地倉庫沒有,而且也不存在于遠端倉庫,Maven在建構的時候會報錯,這種情況可能發生在有些jar包的新版本沒有在Maven倉庫中及時更新。

        1,自定義的本地倉庫路徑     

如下配置,在setting.xml檔案中,本地倉庫有預設配置,在${user.home}/.m2/repository目錄中。

  <!-- localRepository

   | The path to the local repository maven will use to store artifacts.

   |

   | Default: ${user.home}/.m2/repository

  <localRepository>/path/to/local/repo</localRepository>

  -->

當然,我們可以在settings.xml中自定義本地倉庫,加入以下字段即可:

<localRepository>/opt/java/repo</localRepository>

也可以通過指令行的模式指定本地倉庫:(不推薦這麼做)

# mvn clean install -Dmaven.repo.local=/home/juven/myrepo/

        2,自定義遠端倉庫

     預設遠端倉庫配置:

    在apache-maven-3.0.4/lib/maven-model-builder-3.0.4.jar檔案中org/apache/maven/model/pom-4.0.0.xml檔案中定義了中央倉庫:

<repositories>

    <repository>

      <id>central</id>

      <name>Central Repository</name>

      <url>http://repo.maven.apache.org/maven2</url>

      <layout>default</layout>

      <snapshots>

        <enabled>false</enabled>

      </snapshots>

    </repository>

  </repositories>

  <pluginRepositories>

    <pluginRepository>

      <releases>

        <updatePolicy>never</updatePolicy>

      </releases>

    </pluginRepository>

  </pluginRepositories>

   setting.xml配置檔案中定義遠端倉庫,優先級高,配置如下:

   pom.xml的作用範圍限于一個項目, 但一個公司/組織通常不隻開發一個項目,那麼為了避免重複配置,那麼我們可以把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一個遠端倉庫的例子.

<settings>   

 <profiles> 

   <profile>

      <!-- 其他profile -->

   </profile>

   <profile>   

     <id>myProfiel</id>   

     <!--  在這裡加入<repositories>及<pluginRepositories>  --> 

   </profile>   

 </profiles>   

 <!-- 聲明哪些profile被激活,或根據某些條件激活 --> 

 <activeProfiles>   

   <activeProfile>myProfiel</activeProfile>   

 </activeProfiles>   

</settings>

     這裡通過<activeProfile>元素來激活這個profile,這樣我們就可以全局的使用這個配置,不再需要為每個POM做重複的配置了(也可以針對特定的條件激活,比如某些profile隻有在使用JDK 1.4時才生效)。

     在實際的操作過程中,setting.xml配置的遠端倉庫,可以是通過nexus建立的公司自己的倉庫。

    pom.xml檔案定義遠端倉庫,優先級最高,配置如下:

    <repositories>

        <repository>

            <id>Nexus</id>

            <name>Nexus Public Repository</name>

            <url>http://maven.test.sohu.com/nexus/content/groups/public</url>

        </repository>

            <id>nexus-snapshots</id>

            <name>Nexus Snapshot Repository</name>

            <url>http://maven.test.sohu.com/nexus/content/repositories/snapshots</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

    </repositories>

在pom中允許配置多個repository和 plugin repository,其中<snapshots><enabled>true</enabled</snapshots>

告訴Maven可以從這個倉庫下載下傳snapshots版本的構件。而如果有<snapshots><enabled>false</enabled></snapshots>這樣的配置,則告訴Maven不要從這個倉庫下載下傳snapshot版本的構件。

Maven在使用第三方構件和插件時是分開來配置的,是以如果我們也希望插件的下載下傳也通過我們自己的倉庫來下載下傳,那麼我們就需要配置pluginRepository.至于<pluginRepositories>,這是配置Maven從什麼地方下載下傳插件構件,Maven的所有行為都是通過插件來完成的。 <pluginRepository>的配置與<repository>類似。

    三,maven釋出jar包到nexus伺服器

    1),在pom.xml檔案中可以定義如下代碼:

    <distributionManagement>

        <repository>

            <id>nexus-releases</id>

            <name>Nexus Release Repository</name>

            <url>http://maven.test.sohu.com/nexus/content/repositories/releases</url>

        </repository>

        <snapshotRepository>

            <id>nexus-snapshots</id>

            <name>Nexus Snapshot Repository</name>

            <url>http://maven.t.sohu.com/nexus/content/repositories/snapshots</url>

            <uniqueVersion>false</uniqueVersion>

        </snapshotRepository>

    </distributionManagement>

    2)確定Nexus伺服器的Releases倉庫屬性正确。

         進入Nexus控制台,用admin登入。點開“Views/Repositories”選“Repositories”,在Repositories清單中選擇Releases,點configuration,Deployment Policy預設為“Disable Redeploy”,點選修改為“Allow Redeploy”并儲存。

      3)修改使用者目錄下的settings.xml檔案。

         settings.xml檔案路徑為${user.home}/.m2或%{m2_home}/conf/。Windows7系統目錄為C:/Users/使用者名/.m2。

         找到<servers>,然後修改資訊如下:

 <servers>

     <server>

       <id>releases</id>

       <username>deployment</username>

       <password>deployment</password>

     </server>

 </servers>

注意:server的id必須和第1)點中的repository的id一緻。使用者名最好用deployment。

      4)重新設定使用者deployment的密碼。

         進入Nexus控制台,點開Security選Users,在使用者清單中右鍵點選deployment使用者,選Set Password重新設定deployment的密碼為“deployment”,當然也可設定為其他,隻要與第3)點server配置一緻即可。

      5)在工程主目錄下(POM檔案所在目錄)運作“mvn deploy:deploy”即能實作版本的建構和釋出。

    四,maven使用assembly實作自定義打包

pom.xml中設定如下:

<build>

        <plugins>

            <plugin>

                <artifactId>maven-assembly-plugin</artifactId>

                <configuration>

                    <!-- not append assembly id in release file name -->

                    <appendAssemblyId>false</appendAssemblyId>

                    <descriptors>

                        <descriptor>src/main/assemble/package.xml</descriptor>

                    </descriptors>

                </configuration>

                <executions>

                    <execution>

                        <id>make-assembly</id>

                        <phase>package</phase>

                        <goals>

                            <goal>single</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

        </plugins>

    </build>

  其中<artifactId>maven-assembly-plugin</artifactId>的maven-assembly-plugin是這個插件的标準命名,在maven2.0.*中帶的預設版本是

    appendAssemblyId屬性控制是否在生成的打封包件的檔案名中包含assembly id。

    descriptor屬性指定maven-assembly-plugin的配置檔案,當然我設定的是src/main/assemble/package.xml.容許使用多個,功能強大當然用法也複雜,對于簡單情況一個足矣。

    execution的設定是為了将maven-assembly-plugin繼承到标準的maven打包過程中,這樣在運作指令mvn package時就會執行maven-assembly-plugin的操作,進而實作我們需要的自定義打包,這樣就不用再去執行mvn assembly:assembly指令了。

    五,maven的常用指令和參數、

1,常用參數

mvn -e 顯示詳細錯誤

mvn -U 強制更新snapshot類型的插件或依賴庫(否則maven一天隻會更新一次snapshot依賴)

mvn -o 運作offline模式,不聯網更新依賴

mvn -N 僅在目前項目子產品執行指令,關閉reactor

mvn -pl module_name在指定子產品上執行指令

mvn -ff 在遞歸執行指令過程中,一旦發生錯誤就直接退出

mvn -Dxxx=yyy指定java全局屬性

    mvn -Dwtpversion=2.0 指定maven版本

    mvn -Dmaven.test.skip=true 如果指令包含了test phase,則忽略單元測試

    mvn -DuserProp=filePath 指定使用者自定義配置檔案位置

    mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse項目檔案,嘗試從倉庫下載下傳源代碼,并且生成的項目包含子產品版本(注意如果使用公用POM,上述的開關預設已打開)

mvn -Pxxx引用profile xxx。profile的定義在pom.xml檔案中,一般id為test或者product,一個是測試環境的配置,一個是線上環境的配置。配置如下:

<profiles>

        <profile>

            <id>test</id>

            <properties>

                <env>test</env>

            </properties>

        </profile>

            <id>product</id>

                <env>product</env>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

    </profiles>

2,常用指令

mvn compile     編譯生成class檔案

mvn test        運作程式中的單元測試

mvn clean       移除所有上一次建構生成的檔案(例如test和target目錄)

mvn package     打包編譯後的代碼,在target目錄下生成package檔案,預設會生成jar檔案,如果有自定義打包政策,可以生成zip等類型檔案。需要的依賴檔案,會先從本地倉庫找(linux預設為~/.m2/repository/),沒有的話,再從遠處倉庫download

mvn install      在本地Repository中安裝jar,友善本地其它項目使用。預設是安裝打好的包到server的本地mvn倉庫中,linux預設為~/.m2/repository/

常用的打包指令:

# mvn -U -Dmaven.test.skip=true -P test -f pom.xml clean package install

本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/1414824,如需轉載請自行聯系原作者

繼續閱讀