GroupID是項目組織唯一的標識符,實際對應JAVA的包的結構,是main目錄里java的目錄結構。
ArtifactID就是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱。
一般GroupID就是填com.leafive.test這樣子。
groupid和artifactId被統稱為“坐標”是為了保證項目唯一性而提出的,如果你要把你項目弄到maven本地倉庫去,你想要找到你的項目就必須根據這兩個id去查找。
groupId一般分為多個段,這里我只說兩段,第一段為域,第二段為公司名稱。域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織。舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache,它的域是org(因為tomcat是非營利項目),公司名稱是apache,artigactId是tomcat。
比如我創建一個項目,我一般會將groupId設置為cn.zr,cn表示域為中國,zr是我個人姓名縮寫,artifactId設置為testProj,表示你這個項目的名稱是testProj,依照這個設置,你的包結構最好是cn.zr.testProj打頭的,如果有個StudentDao,它的全路徑就是cn.zr.testProj.dao.StudentDao、
http://elim.iteye.com/blog/1860128
使用Maven
目錄:
3.1 使用maven建立自己的項目
3.2 使用mvc compile進行源碼編譯
3.3 使用mvc test-compile編譯測試源碼
3.4 使用mvc test編譯源碼和測試源碼進行測試
3.5 使用mvn package進行項目打包
3.6 使用mvn install安裝jar包到maven的本地倉庫
3.7 使用mvn deploy可以安裝當前項目到遠程倉庫
3.8 使用mvn clean可以清除存放臨時文件的target目錄
3.9 把資源文件一並打到jar包中
3.10 過濾資源文件
3.10.1 使用pom.xml和settings.xml中的元素element作為屬性
3.10.2 使用外部文件的屬性關聯
3.10.3 使用系統屬性
3.11 在pom.xml中定義project的外部依賴包
3.12 使用mvn dependency:tree可以查看一個項目的依賴關系
3.13 修改Maven同時下載artifact的最大數
3.14 在斷開網絡的情況下執行Maven指令
3.15 構建自己的archetype
3.16 使用mvn javadoc:jar生成javadoc
3.17 使用mvn dependency:sources下載源碼
3.1 使用maven建立自己的項目
(1)切換到項目所在的目錄,如:d:\\develop\\apps
(2)執行如下指令:
mvn archetype:generate 這樣就可以根據提示來建立一個maven項目
后面可以接很多參數,常用的有:
-DgroupId=com.company.app 組id
-DartifactId=app 項目名稱,maven會根據這個名稱在當前目錄下新建一個名為該名稱的目錄用於建立項目
-DinteractiveMode=false 是否已交互模式進行,如果是false的話就會采用默認設置建立項目
以下是一個示例:
- mvn archetype:generate -DgroupId=com.tiantian -DartifactId=jxc -DinteractiveMode=false
運行上面的代碼就會在d:\\develop\\apps下面新建一個名為jxc的maven項目
上面建立的只是一個簡單的java應用,那如果我要建立一個web應用該如何呢?以下是一個示例:
- mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.myhost.myapp -DartifactId=myapp
其實使用Maven建立簡單項目時是省略了參數archetypeArtifactId,當沒有指定該參數時默認將使用maven-archetype-quickstart。所以要把上面建立一個普通java應用的Maven項目的指令寫完整的話就應該是:
- Mvn archetype:generate –DarchetypeGroupId=org.apache.maven.archetypes –DarchetypeArtifactId=maven-archetype-quickstart –DgroupId=com.tiantian –DartifactId=jxc –DinteractiveMode=false
從上面我們可以看出要建立什么樣的項目就需要使用什么樣的archetype,archetype就是Maven定義好的項目類型的模板,一個對應項目的目錄架構。archetype是通過參數archetypeArtifactId來指定的。除了上面介紹的兩種archetype之外,Maven還為我們提供了以下幾種archetype。
archetypeArtifactId |
描述 |
maven-archetype-archetype |
包含一個archetype的例子,主要用於當我們要建立自己的archetype的時候 |
maven-archetype-j2ee-simple |
包含一個簡單的j2ee應用的例子 |
maven-archetype-plugin |
包含一個Maven plugin的例子 |
maven-archetype-plugin-site |
包含一個Maven plugin site的例子 |
Maven-archetype-portlet |
包含一個portlet的例子 |
Maven-archetype-simple |
包含一個簡單maven項目 |
Maven-archetype-site |
包含一個maven site的例子,它能夠展示一些支持的文檔類型,包括APT、XDoc和FML |
Maven-archetype-site-simple |
包含一個maven site的例子 |
在后續的內容中將介紹關於如何構建自己的archetype的內容。
3.2 使用mvc compile進行源碼編譯
在目錄d:\\develop\\apps下面建立了項目jxc之后,我們就可以進入目錄d:\\develop\\apps\\jxc執行指令mvn compile進行編譯了。編譯后的文件將放在項目根目錄下的target目錄中。
3.3 使用mvc test-compile編譯測試源碼
在目錄d:\\develop\\apps下建立了項目jxc之后,我們就可以在cmd中切換目錄到d:\\develop\\apps\\jxc,然后執行指令mvc test-compile進行測試源碼編譯。
3.4 使用mvc test編譯源碼和測試源碼進行測試
在目錄d:\\develop\\apps\\jxc下面執行指令mvc test將先編譯源碼,再編譯測試源碼,然后執行測試代碼。
3.5 使用mvn package進行項目打包
在項目所在的目錄執行指令mvn package可以進行項目打包,打包方式是在項目根目錄下的pom.xml文件中的packaging元素定義的,如果定義為jar則打為jar包,如果是war則打為war包,如果是ear則為ear包。如果pom.xml中沒有定義packaging元素,則會使用默認值jar。打包后的文件將會放在項目根目錄下的target目錄下。打包后的文件名將是在pom.xml文件中定義的artifactId-version的形式,比如在pom.xml中定義的artifactId是hello,定義的version是1.0,則打包后生成的文件的名稱將是hello-1.0。
3.6 使用mvn install安裝jar包到maven的本地倉庫
使用mvn install可以把mvn package打包好的jar安裝到maven的本地倉庫。本地倉庫默認是在~/.m2/repository,可以在maven安裝目錄下的conf/settings文件中的localRepository標簽中定義本地倉庫的路徑。
當我們需要安裝一個本地jar包到本地資源庫的時候我們可以使用“mvn install:install-file”指令,使用該指令時有幾個參數需要指定。file:表示本地jar包所在的路徑;groupId:表示jar包被安裝到本地倉庫之后的groupId;artifactId:表示jar包被安裝到本地倉庫之后的artifactId;version:表示安裝到本地倉庫之后對應的版本;packging:表示當前組件被引用的類型,既然我們是安裝jar包則這里對應的自然是jar了。示例,假如現在我們需要安裝一個jar包“c:\jars\abc.jar”到我們的Maven本地倉庫,那么我們可以在命令窗口執行以下命令:
- mvn install:install-file -Dfile=c:\jars\abc.jar -DgroupId=com.tiantian -DartifactId=abc -Dversion=1.0 -Dpackaging=jar
這樣就會把我們的“c:\jars\abc.jar”以groupId為“com.tiantian”,artifactId為“abc”,version為“1.0”,packaging類型為jar安裝到我們的本地倉庫,之后我們就可以直接在我們本地的Maven項目中引用該依賴類型了。如:
- <dependency>
- <groupId>com.tiantian</groupId>
- <artifactId>abc</artifactId>
- <version>1.0</version>
- </dependency>
3.7 使用mvn deploy可以安裝當前項目到遠程倉庫
3.8 使用mvn clean可以清除存放臨時文件的target目錄
3.9 把資源文件一並打到jar包中
如果需要把一些資源文件也一並打包到jar包里面的話,需要在${basedir}/src/main下新建一個resources目錄,然后把所有的資源文件都放到這個目錄中,這樣這些文件都會放到類路徑下面。如果需要在測試代碼中訪問到對應的資源,那么相對的就需要在${basedir}/src/test下新建一個resources目錄,然后把相應的資源文件放在這個目錄下。
3.10 過濾資源文件
有的時候有些資源文件中的值我們需要在編譯的時候動態的指定,maven允許我們在建立文件的時候以${property_name}的方式指定,這樣當我們進行編譯的時候就會自動的把property_name對應的值替換${property_name}。這個property可以是pom.xml中定義的值,也可以是settings.xml中定義的值,也可以是定義在外部屬性文件中的值,還可以是系統屬性。maven這種動態替換屬性值的功能默認是關閉的,如果要打開的話需要在項目的pom.xml文件中指定filtering的值為true,默認是false。如下示例:
- <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.tiantian.mavenApp</groupId>
- <artifactId>mavenApp</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>mavenAppTest</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
- </project>
從上面的文件我們可以看出,filtering這個參數是針對於特定的資源文件目錄的,而且我們還可以使用directory來指定資源文件的存放位置,默認是src/main/resources。這個build元素是有默認值的,因為我們需要改變filtering的值,所以需要重新定義build,然后覆蓋里面的默認值。
3.10.1使用pom.xml和settings.xml中的元素element作為屬性
我們可以使用pom.xml文件中的element對應的值來作為屬性值。在maven中,使用pom來表示pom.xml中的根元素project,所以我們可以使用${pom.name}來表示project元素下面的name元素,使用${pom.version}來表示project元素下面的version元素。有些元素在pom.xml文件中是沒有明確定義的,但是那不代表它們不存在,這是因為它們有一個默認值,像這種元素我們也可以直接拿來使用。同樣的我們需要使用settings.xml中的元素的時候可以使用settings前綴來關聯,如${settings.localRepository}就是在settings.xml中定義的localRepository元素的值。下面是一組示例,文件都是定義在resources目錄下的:
文件application.properties
- project_name=${pom.name}
- project_version=${pom.version}
- project_modelVersion=${pom.modelVersion}
- project_artifactId=${pom.artifactId}
- settings_localRepository=${settings.localRepository}
文件test.txt
- project_version=${pom.version}
- project_modelVersion=${pom.modelVersion}
- project_artifactId=${pom.artifactId}
- settings_localRepository=${settings.localRepository}
在resources目錄下定義了上面兩個文件之后,在命令行模式下進入pom.xml文件所在的那一級目錄,也就是項目的根目錄,之后使用mvn compile進行編譯,編譯后可以到target/classes目錄下找到對應的資源文件,打開可以看到如下內容:
application.properties文件的內容:
- project_name=mavenAppTest
- project_version=1.0-SNAPSHOT
- project_modelVersion=4.0.0
- project_artifactId=mavenApp
- settings_localRepository=D:\\develop\\mavenRepository
test.txt文件的內容:
- project_version=1.0-SNAPSHOT
- project_modelVersion=4.0.0
- project_artifactId=mavenApp
- settings_localRepository=D:\\develop\\mavenRepository
如果我們只需要對資源文件進行處理的話也可以使用mvn process-resources指令,該指令是專門用於處理資源文件的,而mvn compile是在編譯的時候處理了資源文件。
3.10.2使用外部文件的屬性關聯
要使用外部文件的屬性來關聯資源文件里面定義的屬性值,那么我們就需要告訴maven應該去哪里找這個屬性文件,這是通過在pom.xml中指定filter的值來指定的。
- <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.tiantian.mavenApp</groupId>
- <artifactId>mavenApp</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>mavenAppTest</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <filters>
- <filter>src/main/filters/testFilter.properties</filter>
- </filters>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
- </project>
在上面代碼中我們通過build下面的filters下面的filter元素指定了一個外部用於資源文件過濾的屬性文件src/main/filters/testFilter.properties,接着我們在src/main/filters下面建立testFilter.properties文件,其內容如下:
- myFilter.maven.test=test
- myFilter.maven.username=andy
然后我們在resources目錄下面定義一個application.properties文件,內容如下:
- project_name=${pom.name}
- project_version=${pom.version}
- project_modelVersion=${pom.modelVersion}
- project_artifactId=${pom.artifactId}
- settings_localRepository=${settings.localRepository}
- filter_username=${myFilter.maven.username}
接下來我們執行mvn process-resources指令來處理資源文件,將在target/classes下面對應的application.properties文件中看到如下內容:
- project_name=mavenAppTest
- project_version=1.0-SNAPSHOT
- project_modelVersion=4.0.0
- project_artifactId=mavenApp
- settings_localRepository=D:\\develop\\mavenRepository
- filter_username=andy
我們可以看到我們在application.properties文件中定義的${myFilter.maven.username}已經被指定的外部屬性文件testFilter.properties的屬性myFilter.maven.username對應的屬性值andy所取代。像這種指定外部屬性文件來過濾資源文件的方式也可以在pom.xml中的properties元素下指定對應的子元素作為屬性名稱的形式來達到相同的效果。在上面示例的基礎上,我們先在pom.xml文件的properties元素下面加一個myFilter.maven.username元素,然后指定其值為super,這時候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.tiantian.mavenApp</groupId>
- <artifactId>mavenApp</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>mavenAppTest</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <myFilter.maven.username>super</myFilter.maven.username>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <filters>
- <filter>src/main/filters/testFilter.properties</filter>
- </filters>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
- </project>
接着,我們再次運行mvn process-resources指令,然后查看target/classes目錄下的application.properties文件的內容會是這個樣子:
- project_name=mavenAppTest
- project_version=1.0-SNAPSHOT
- project_modelVersion=4.0.0
- project_artifactId=mavenApp
- settings_localRepository=D:\\develop\\mavenRepository
- filter_username=super
我們可以看到filter_username已經由src/main/filters/testFilter.properties中指定的屬性myFilter.maven.username的值user變成了pom.xml中properties元素的子元素myFilter.maven.username的值super。由此我們也可以看出在pom.xml文件內部定義的屬性值將具有更高的優先級,它會覆蓋外部屬性文件中相同的屬性定義。
跟需要替換屬性值的資源文件可以是不同的文件類型一樣,用於關聯屬性的外部文件也可以是不同的文件類型。為了證明這個問題,我們先在pom.xml中新增一個filter元素,其值指向src/main/filters/testFilter.txt,然后在src/main/filters下新建文件內容為myFilter.maven.fileType=text的testFilter.txt文件,接着在資源文件application.properties中新增一行內容為filter_fileType=${myFilter.maven.fileType},之后運行mvn process-resources指令,之后我們可以看到target/classes下的資源文件application.properties的文件內容如下:
- project_name=mavenAppTest
- project_version=1.0-SNAPSHOT
- project_modelVersion=4.0.0
- project_artifactId=mavenApp
- settings_localRepository=D:\\develop\\mavenRepository
- filter_username=super
- filter_fileType=text
3.10.3使用系統屬性
過濾資源還可以使用來自系統屬性的值,比如java.version,或者在命令行使用-D參數指定的參數。我們來做一下實驗,先把我們的application.properties文件修改為如下內容:
- project_name=${pom.name}
- java_version=${java.version}
- user_home=${user.home}
- command.line.prop=${command.line.prop}
接下來,我們執行指令mvn process-resources –Dcommand.line.prop=hello,之后我們可以看到target/classes下文件application.properties的內容為:
- project_name=mavenAppTest
- java_version=1.7.0_07
- user_home=C:\\Users\\andy
- command.line.prop=hello
3.11 在pom.xml中定義project的外部依賴包
對於每一個外部依賴都有4個元素是必須定義的,它們是groupId、artifactId、version和scope。其中groupId、artifactId和version必須和依賴包中使用maven打包時定義的pom.xml中定義的相對應的元素的值相同。比如說我們有一個maven項目叫projectA,它的pom.xml中定義的groupId、artifactId和version如下:
- <groupId>com.tiantian.projectA</groupId>
- <artifactId>projectA</artifactId>
- <version>1.0</version>
之后我們用mvn package把projectA打包為一個jar包,然后使用mvn install把打好的jar包安裝到本地倉庫。這個時候有另一個項目projectB,它需要在它的pom.xml中定義對projectA的依賴,這個時候它的pom.xml中定義對projectA依賴的groupId、artifactId和version都應該和projectA的pom.xml中定義的保持一致,具體代碼如下:
- <dependency>
- <groupId>com.tiantian.projectA</groupId>
- <artifactId>projectA</artifactId>
- <version>1.0</version>
- <scope>running</scope>
- </dependency>
元素scope的值表示引用的作用范圍,主要取值有compile、test、provided、runtime和system。關於scope的更多介紹將在以后的文中作更多的介紹。對於pom.xml中使用dependency定義的引用信息,maven在需要使用的時候會先從本地倉庫取,如果在本地倉庫取不到的時候就會嘗試從遠程倉庫下載。
當我們需要引用一個依賴包,而不知道其對應的groupId等信息的時候,我們可以在網站http://mvnrepository.com/中進行搜索尋找對應的依賴包。