Maven那点事儿

来源:互联网 发布:godaddy建站 编辑:程序博客网 时间:2024/06/03 15:45

Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
Maven依赖的网址:http://mvnrepository.com/

安装Maven 和 Maven的Eclipse插件

http://blog.csdn.net/qjyong/article/details/9098213

Maven规定的目录结构

若要使用Maven,那么项目的目录结构必须符合Maven的规范
first_maven
|– pom.xml
-- src
|-- main
| |-- java
| |
– com
| | -- test
| |
– App.java
| -- resources
|
– META-INF
| -- application.properties
– test
-- java
– com
-- test
– AppTest.java

   pom.xml:用于定义或者添加jar包的依赖  src-main:用于存放java源文件  src-test:用于存放测试用例。

配置文件

Maven2 主要配置文件有pom.xml和settings.xml。

1. pom.xml
我们知道,Maven项目,依赖,构建配置,以及构件,所有这些都是要建模和表述的对象,这些对象就是通过pom.xml 文件描述的。这个POM 告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出等等。该文件就是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。
它包含的基本项如下:
poject 这是pom.xml的顶级元素。
modelVersion 这是元素指出了这个POM使用的是那个版本的对象模型。这个模型的版本自身么是经常改变的,但这种改变是为了使模型更加的稳定。
groupId 这个元素指出创建这个工程的组织或团队的唯一标识,并且这个也是一个项目的关键标识,推荐使用这个组织或团队的完整域名。例如:org.apache.maven.plugins是为Maven plug-ins定义的groupId。
artifactId 这个元素指出这个工程的主要制品的基本名称。一个工程的主要制品如果是jar文件,次要制品如果是源码包,则次要制品的名称的一部分也使用artifactId。典型的制品名称使用这样的格式:-.(例如,myapp-1.0.jar)。
packaging 这个元素指出制品的类型(例如:JAR,WAR,EAR等等)。这个元素不仅仅指示出制品的类型,同时也指示出工程构建过程中的部分生命周期。Packaging的默认值是JAR。
version 这个元素指出这个项目产生的制品的版本号,Maven在帮助开发人员管理版本号时走了很长的路,以后你将经常看到SNAPSHOT在一个版本中,这个表示一个工程仍然在开发状态。
name 这个元素指出这个工程显示的名称。这个常用于Maven产生的文档中。
url 这个员算指出在哪里能发现工程的站点。这个常用于Maven产生的文档中。
desription 这个元素提供了这个工程基本的描述。这个也常用于Maven产生的文档中。
以上只是pom.xml中的一些基本项,完整的pom.xml的元素介绍请参考:
http://maven.apache.org/maven-model/maven.html

  1. settings.xml
    在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在两种级别:
    用户级,针对操作系统登录用户而言。一般在$home/.m2/,对于windows用户,就是目录:C:\Documents and Settings\用户名.m2\settings.xml。
    全局级:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目录环境变量名。
    在settings.xml中可以配置,如本地Repository、proxy等等.

3.settings.xml中配置
1.设置本地仓库
1.1 示例语法

    <localRepository>D:/maven/r2/myrepository</localRepository>
2.修改JDK版本2.1 JDK1.7
        <profile>            <id>jdk-1.7</id>            <activation>                <activeByDefault>true</activeByDefault>                <jdk>1.7</jdk>            </activation>            <properties>                <maven.compiler.source>1.7</maven.compiler.source>                <maven.compiler.target>1.7</maven.compiler.target>                <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>            </properties>        </profile>
3.修改镜像地址(不使用nexus时配置)3.1 阿里云镜像
        <mirror>            <id>alimaven</id>            <name>aliyun maven</name>            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>            <mirrorOf>central</mirrorOf>        </mirror>

Maven基本命令

1.-v:查询Maven版本
本命令用于检查maven是否安装成功。
Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。

2.compile:编译
将Java源文件编译成class文件

3.test:测试项目
执行test目录下的测试用例

4.package:打包
将项目打成jar包

5.clean:删除target文件夹

6.install:安装
将当前项目放到Maven的本地仓库中。供其他项目使用

什么是Maven仓库?

Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。

1.本地仓库
Maven本地的Jar包仓库。
2.中央仓库
Maven官方提供的远程仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。

什么是“坐标”?

在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。 如下代码中,groupId和artifactId构成了一个Jar包的坐标。
<dependency>    <groupId>ch.qos.logback</groupId>    <artifactId>logback-classic</artifactId>    <version>1.1.1</version></dependency>
groupId:所需Jar包的项目名artifactId:所需Jar包的模块名version:所需Jar包的版本号

传递依赖 与 排除依赖

1.传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。

2.排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)

<exclusions>    <exclusion>        <groupId>ch.qos.logback</groupId>        <artifactId>logback-classic</artifactId>    </exclusion></exclusions>

依赖冲突

若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。

*短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
在此时,Maven只会引用引用路径最短的Jar。

*声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。

聚合

1.什么是聚合?
将多个项目同时运行就称为聚合。

2.如何实现聚合?
只需在pom中作如下配置即可实现聚合:

    <modules>        <module>../模块1</module>        <module>../模块2</module>        <module>../模块3</module>    </modules>

继承

1.什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

2.如何实现继承?
父pom配置:将需要继承的Jar包的坐标放入标签即可。

    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.apache.shiro</groupId>                <artifactId>shiro-spring</artifactId>                <version>1.2.2</version>            </dependency>         </dependencies>    </dependencyManagement>

子pom配置:

<parent>    <groupId>父pom所在项目的groupId</groupId>    <artifactId>父pom所在项目的artifactId</artifactId>    <version>父pom所在项目的版本号</version></parent>

使用Maven构建Web项目

1.New Maven项目:选择WebApp:
创建maven project时选择packaging为war
在webapp文件夹下新建META-INF和WEB-INF/web.xml

2.若使用JSP,需添加Servlet依赖:
注:Servlet依赖只在编译和测试时使用!

<dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.0.1</version>    <!-- 只在编译和测试时运行 -->    <scope>provided</scope></dependency>

3.配置tomcat插件

    <build>        <plugins>            <plugin>                <groupId>org.apache.tomcat.maven</groupId>                <artifactId>tomcat7-maven-plugin</artifactId>                <version>2.2</version>                <configuration>                    <!-- 控制tomcat端口号 -->                    <port>80</port>                    <!-- 项目发布到tomcat后的名称 -->                    <!-- / 相当于把项目发布名称为ROOT -->                    <!-- /abc -->                    <path>/</path>                </configuration>            </plugin>        </plugins>    </build>

4.右键项目–> run as –> maven build–>Goals 中输入
clean tomcat7:run

资源拷贝插件

1.maven默认只把src/main/resources里面的非.java文件进行编译到classes中
2.如果希望src/main/java下的文件也被编辑到classes中,在pom.xml中配置
2.1 下面内容配置在中

<resources>            <resource>                <directory>src/main/java</directory>                <includes>                    <include>**/*.xml</include>                </includes>            </resource>            <resource>                <directory>src/main/resources</directory>                <includes>                    <include>**/*.xml</include>                    <include>**/*.properties</include>                </includes>            </resource>        </resources>