Maven

来源:互联网 发布:照片打印软件免费版 编辑:程序博客网 时间:2024/05/22 14:26

Maven项目的目录约定

MavenProjectRoot(项目根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
   |----target ——项目输出位置

   |----pom.xml ----用于标识该项目是一个Maven项目

pom.xml文件中的内容如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0"  3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  5 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6     <!--所有的Maven项目都必须配置这四个配置项--> 7     <modelVersion>4.0.0</modelVersion> 8     <!--groupId指的是项目名的项目组,默认就是包名--> 9     <groupId>cn.gacl.maven.hello</groupId>10     <!--artifactId指的是项目中的某一个模块,默认命名方式是"项目名-模块名"-->11     <artifactId>hello-first</artifactId>12     <!--version指的是版本,这里使用的是Maven的快照版本-->13     <version>SNAPSHOT-0.0.1</version>14 </project>
使用mvn compile编译完成之后,在项目根目录下会生成一个target文件夹

使用"mvn clean"命令清除编译结果,也就是把编译生成的target文件夹删掉

执行"mvn test"命令测试项目时,Maven先帮我们编译项目,然后再执行测试代码。

修改从Maven中心仓库下载到本地的jar包的默认存储位置

  从Maven中心仓库下载到本地的jar包的默认存放在”${user.home}/.m2/repository”中,${user.home}表示当前登录系统的用户目录(如"C:\Users\gacl"),如下图所示

  

  

  Jar包存放在这个位置不太好,我们希望能够自己定义下载下来的jar包的存放位置,因此我们可以自己设置下载到本地时的jar包的存放目录。

  在“E:\”目录下创建一个“repository”文件夹

  

  找到apache-maven-3.2.3\conf目录下的settings.xml文件,如下图所示:

  

  编辑setting.xml文件,如下图所示:

  

  加上下面的代码

1 <localRepository>E:/repository</localRepository>

  

  这样就可以把jar包下载到我们指定的E:/repository目录中了,如下图所示:

  

  把jar包下载到本地的好处就是,当编译时,会优先从本地的jar包去找,如果本地存在,就直接拿来用,如果不存在,就从Maven的中心仓库去下载。如下图所示:

  

  第一次执行"mvn compile"和"mvn clean"这两个命令时,Maven会去中央仓库下载需要的jar包,而第二次执行这两个命令时,由于所需的jar包已经在本地的仓库中存储,所以就可以直接拿来用了,这样就省去了去中央仓库下载jar包的时间。

Maven安装项目的过程,实际上就是把项目进行【清理】→【编译】→【测试】→【打包】,再把打包好的jar放到我们指定的存放jar包的Maven仓库中,如下图所示:

  

  所以使用"mvn install"命令,就把maven构建项目的【清理】→【编译】→【测试】→【打包】的这几个过程都做了,同时将打包好的jar包发布到本地的Maven仓库中,所以maven最常用的命令还是"mvn install",这个命令能够做的事情最多。

使用mvn archetype:generate命令,如下所示:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

  2、使用mvn archetype:create命令,如下所示:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

  使用"mvn archetype:generate"命令和"mvn archetype:create"都可以创建项目,目前没有发现这两者的区别,唯一区别的地方就是发现使用"mvn archetype:generate"命令创建项目时要特别长的时间才能够将项目创建好,而使用"mvn archetype:create"命令则可以很快将项目创建出来。

pom.xml文件的节点元素说明:

    <project>       pom文件的顶级节点
    <modelVersion>     object model版本,对Maven2和Maven3来说,只能是4.0.0 
    <groupId>       项目创建组织的标识符,一般是域名的倒写
    <artifactId>      定义了项目在所属组织的标识符下的唯一标识,一个组织下可以有多个项目
    <version>        当前项目的版本,SNAPSHOT,表示是快照版本,在开发中

    <packaging>      打包的方式,有jar、war、ear等
    <name>        项目的名称
    <url>          项目的地址

    <properties>    属性配置,比如:<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <dependencies>     构建项目依赖的jar

  其中由groupId、artifactId和version唯一的确定了一个项目坐标


除了使用Tomcat服务器运行Web项目之外,我们还可以在Web项目中集成Jetty发布运行,首先在pom.xml文件中配置Jetty插件,如下:

复制代码
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3   <modelVersion>4.0.0</modelVersion> 4   <groupId>com.mycompany.app</groupId> 5   <artifactId>myWebApp</artifactId> 6   <packaging>war</packaging> 7   <version>1.0-SNAPSHOT</version> 8   <name>myWebApp Maven Webapp</name> 9   <url>http://maven.apache.org</url>10   <dependencies>11     <dependency>12       <groupId>junit</groupId>13       <artifactId>junit</artifactId>14       <version>3.8.1</version>15       <scope>test</scope>16     </dependency>17   </dependencies>18   <build>19     <finalName>myWebApp</finalName>20      <pluginManagement>21         <!--配置Jetty-->22           <plugins>23             <plugin>24              <groupId>org.mortbay.jetty</groupId>   25              <artifactId>maven-jetty-plugin</artifactId>26             </plugin>27           </plugins>28     </pluginManagement>29   </build>30 </project>

打开命令行窗口,切换到myWebApp目录,然后执行:mvn jetty:run启动Jetty服务器,如下图所示:

  

  

  接着就可以在8080端口上访问应用了。如下图所示:

  

Maven创建项目的命令说明

  mvn archetype:create或者mvn archetype:generate  固定写法

  -DgroupId                       组织标识(包名)

  -DartifactId                      项目名称

  -DarchetypeArtifactId                  指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project

  -DinteractiveMode                    是否使用交互模式

  archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架,DgroupId是软件包的名称,DartifactId是项目名,DarchetypeArtifactId是可用的mvn项目骨架,目前可以使用的骨架有:

  • maven-archetype-archetype
  • maven-archetype-j2ee-simple
  • maven-archetype-mojo
  • maven-archetype-portlet
  • maven-archetype-profiles (currently under development)
  • maven-archetype-quickstart
  • maven-archetype-simple (currently under development)
  • maven-archetype-site
  • maven-archetype-site-simple
  • maven-archetype-webapp

  每一个骨架都会建相应的目录结构和一些通用文件,最常用的是maven-archetype-quickstartmaven-archetype-webapp骨架。maven-archetype-quickstart骨架是用来创建一个Java Project,而maven-archetype-webapp骨架则是用来创建一个JavaWeb Project。

  不得不说,Maven的确是一个很好的项目构建工具。掌握好Maven对于项目开发是非常有帮助的。

依赖范围

  依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
    1.compile 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
    2.test:测试依赖范围。只对于测试classpath有效
    3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
    4.runtime:运行时提供。例如:jdbc驱动


Maven三大生命周期

  Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  3. Site Lifecycle 生成项目报告,站点,发布站点。

  再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。 
  clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在clean之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在clean之后立刻完成的工作

  "mvn clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。 
  Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作

  1. site 生成项目的站点文档
  2. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  3. site-deploy 将生成的站点文档部署到特定的服务器上

  这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
  Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • 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 接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 将包安装至本地仓库,以让其它项目依赖。
  • deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

  运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

聚合与继承实战演练

  创建四个Maven项目,如下图所示:

   

  这四个项目放在同一个目录下,方便后面进行聚合和继承

  

  Parent项目是其它三个项目的父项目,主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有Parent项目中的配置,首先配置Parent项目的pom.xml,添加对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合以及jar包依赖,pom.xml的配置信息如下:

  Parent项目的pom.xml配置

复制代码
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3     <modelVersion>4.0.0</modelVersion> 4  5     <groupId>me.gacl.maven</groupId> 6     <artifactId>Parent</artifactId> 7     <version>0.0.1-SNAPSHOT</version> 8     <packaging>pom</packaging> 9 10     <name>Parent</name>11     <url>http://maven.apache.org</url>12     13     <!-- 对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合 -->14     <modules>15         <module>../Hello</module>16         <module>../HelloFriend</module>17         <module>../MakeFriends</module>18     </modules>19     20     <!-- 定义属性 -->21     <properties>22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>23         <junit.version>4.9</junit.version>24         <maven.version>0.0.1-SNAPSHOT</maven.version>25     </properties>26 27     <!-- 用dependencyManagement进行jar包依赖管理 -->28     <dependencyManagement>29         <!-- 配置jar包依赖 -->30         <dependencies>31             <dependency>32                 <groupId>junit</groupId>33                 <artifactId>junit</artifactId>34                 <!-- 访问junit.version属性 -->35                 <version>${junit.version}</version>36                 <scope>test</scope>37             </dependency>38             <dependency>39                 <groupId>me.gacl.maven</groupId>40                 <artifactId>Hello</artifactId>41                 <!-- 访问maven.version属性 -->42                 <version>${maven.version}</version>43                 <scope>compile</scope>44             </dependency>45             <dependency>46                 <groupId>me.gacl.maven</groupId>47                 <artifactId>HelloFriend</artifactId>48                 <!-- 访问maven.version属性 -->49                 <version>${maven.version}</version>50             </dependency>51         </dependencies>52     </dependencyManagement>53 </project>
复制代码

  在Hello项目的pom.xml中继承Parent项目的pom.xml配置

复制代码
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3    4   <modelVersion>4.0.0</modelVersion> 5   <artifactId>Hello</artifactId> 6    7       <!-- 继承Parent项目中的pom.xml配置 --> 8        <parent>   9           <groupId>me.gacl.maven</groupId>10          <artifactId>Parent</artifactId>11           <version>0.0.1-SNAPSHOT</version>12           <!-- 使用相对路径 -->13         <relativePath>../Parent/pom.xml</relativePath>  14     </parent>15     16     <dependencies>17         <dependency>18             <groupId>junit</groupId>19             <artifactId>junit</artifactId>20         </dependency>21     </dependencies>22 </project>
复制代码

  在HelloFriend项目的pom.xml中继承Parent项目的pom.xml配置

复制代码
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3     <modelVersion>4.0.0</modelVersion> 4     <artifactId>HelloFriend</artifactId> 5     <name>HelloFriend</name> 6      7     <!-- 继承Parent项目中的pom.xml配置 --> 8     <parent> 9         <groupId>me.gacl.maven</groupId>10         <artifactId>Parent</artifactId>11         <version>0.0.1-SNAPSHOT</version>12         <relativePath>../Parent/pom.xml</relativePath>13     </parent>14     <dependencies>15         <dependency>16             <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,17             可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->18             <groupId>junit</groupId>19             <artifactId>junit</artifactId>20         </dependency>21         <!-- HelloFriend项目中使用到了Hello项目中的类,因此需要添加对Hello.jar的依赖 22         Hello.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了23         因此这里也可以省略不写了24         -->25         <dependency>26             <groupId>me.gacl.maven</groupId>27             <artifactId>Hello</artifactId>28         </dependency>29     </dependencies>30 </project>
复制代码

  在MakeFriends项目的pom.xml中继承Parent项目的pom.xml配置

复制代码
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3     <modelVersion>4.0.0</modelVersion> 4     <artifactId>MakeFriends</artifactId> 5     <!-- 继承Parent项目中的pom.xml配置 --> 6     <parent> 7         <groupId>me.gacl.maven</groupId> 8         <artifactId>Parent</artifactId> 9         <version>0.0.1-SNAPSHOT</version>10         <relativePath>../Parent/pom.xml</relativePath>11     </parent>12     <dependencies>13         <dependency>14         <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,15             可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->16             <groupId>junit</groupId>17             <artifactId>junit</artifactId>18         </dependency>19         <dependency>20         <!-- MakeFriends项目中使用到了HelloFriend项目中的类,因此需要添加对HelloFriend.jar的依赖 21         HelloFriend.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了22         因此这里也可以省略不写了23         -->24             <groupId>me.gacl.maven</groupId>25             <artifactId>HelloFriend</artifactId>26         </dependency>27     </dependencies>28 </project>
复制代码

  以上的四个项目的pom.xml经过这样的配置之后,就完成了在Parent项目中聚合Hello、HelloFriend、MakeFriends这三个子项目(子模块),而Hello、HelloFriend、MakeFriends这三个子项目(子模块)也继承了Parent项目中的公共配置,这样就可以使用Maven一次性构建所有的项目了,如下图所示:

  

  选中Parent项目的pom.xml文件→【Run As】→【Maven install】,这样Maven就会一次性同时构建Parent、Hello、HelloFriend、MakeFriends这四个项目,如下图所示:

  


<packaging>pom</packaging>,pom表示它是一个被继承的模块

使用Maven构建多模块项目:http://www.cnblogs.com/xdp-gacl/p/4242221.html