Maven学习(二):属性、坐标与依赖

来源:互联网 发布:c语言多个else if 编辑:程序博客网 时间:2024/05/18 00:15

前言:

1、pom文件的配置,主要内容为属性、坐标与依赖、插件、仓库以及其他一些配置。

2、理解这些配置的内容,在一定程度上也就理解了Maven 的使用。


一、属性

(一)Maven内置属性:

1、${basedir} 项目根目录,即包含 pom.xml 的目录。

2、${version} 表示项目版本。


(二)Pom属性:使用该类属性引用pom文件内对应元素的值。如

1、${project.xxx} 当前pom文件的任意节点的内容。如${project.artifactId} 就对应了 <project><artifactId>元素的值。

2、${project.build.source.directory} :项目的主源码目录,默认为src/main/java

3、${project.build.directory} 构建项目输出目录,缺省为target

4、${project.build.outputDirectory} :项目主代码编译输出目录,缺省为target/classes

5、${project.build.finalName} 项目打包输出文件的名称,缺省为${project.artifactId}-${project.version}

6、${project.packaging} 打包类型,缺省为jar


(三)自定义属性:<properties >标签

1、实例

<span style="font-family:Arial;font-size:18px;"><properties>        <project.charset>UTF-8</project.charset>        <jdk.version>1.6</jdk.version>        <spring.version>3.2.2.RELEASE</spring.version>        <springsecurity.version>2.0.5.RELEASE</springsecurity.version>        <asm.version>3.3</asm.version>        <srtus2.version>2.3.15.1</srtus2.version>        <cxf.version>2.7.4</cxf.version>    </properties></span>


(四)Setting 属性:与pom属性同理

1、引用:以 setting. 开头的属性引用settings.xml 文件中 XML 元素的值,如常用的 ${settings,localRespository} 指向本地仓库。

(五)Java系统属性 与 环境变量属性。

1、Java系统属性:使用Maven属性引用。如 ${user.home}:指向用户目录。

2、环境变量属性:使用 env. 开头的Maven 属性引用。如${env.JAVA_HOME} 指代JAVA_HOME 的值。

3、使用 mvn help : system 插卡所有Java系统变量 与 环境变量变量 。

(六)注意点。

1、Maven属性只能在pom中被解析,只有使用过滤后才可以在配置文件中被解析。

2、定义的属性在 pom 的其他地方使用 ${key} 引用。如这边定义的 <a>111</a> 在pom 的其他地方引用${a}使用。

3、使用属性与 Profile、 资源过滤可以实现动态构建。



二、坐标

1、实例

<groupId>JavaMaven</groupId><artifactId>maven-web-dao</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>maven-web-dao Maven Webapp</name>

2、关键字:

1)groupId:定义当前maven项目(模块)隶属的实际项目即一般为项目名。

2)artifactId:当前的maven项目名(模块名),即模块名。

3)version:版本。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。

4)package:定义Maven 的打包的方式,默认为 jar 。

5)classifier:定义一些属性构建。如通过插件生成源码包 xxx.sources.jar 等附属构建,这时sources 就是一个classifier 。

综合理解:如 项目spring-framework 为一个groupId,而其中 spring-core 和 spring-aop为分别的两个 artifactId 。


三、依赖  dependency

(一)简单依赖

1、新建项目JavaMaven的两个模块maven-entity 和 maven-common:common模块依赖于entity模块

2、maven-entity 模块中需要引入log4j 和 hibernate ,jar都在本地仓库的com/web-jar文件下。pom文件如下:

<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;"><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>JavaMaven</groupId>  <artifactId>maven-entity</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>maven-entity</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>4.10</version>      <scope>test</scope>    </dependency>        <dependency><groupId>com.web-jar</groupId><artifactId>hibernate-jpa</artifactId><version>2.0-api-1.0.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId><artifactId>hibernate-core</artifactId><version>4.2.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId><artifactId>hibernate-commons-annotations</artifactId><version>4.0.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId>  <artifactId>log4j</artifactId>  <version>1.2.15</version></dependency>  </dependencies></project></span></span></span>

3、maven-common 模块依赖于 maven-entity 模块:

1)maven-entity 利用 install 打成jar包放入本地仓库:右击 run as--> maven build ,输入  clean install即可。



2)编写maven-common 的pom文件:

<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;"><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>JavaMaven</groupId>  <artifactId>maven-common</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>maven-common</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>        <!-- Maven内置变量说明 ${project.xxx} 当前pom文件的任意节点的内容-->    <dependency>      <groupId>${project.groupId}</groupId>    <artifactId>maven-entity</artifactId>    <version>${project.version}</version>    </dependency>  </dependencies></project></span></span></span>


3)这时,entity依赖的hibernate 和 log4j的包,也会被comon所依赖,但是junit4却不会被common依赖:


4)这样,就完成了模块的依赖,可以在 common 中使用 entity ,如:

<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;">package com.maven.common;import com.maven.entity.PersonEntity;public class CommonTest {public static void main(String[] args) {PersonEntity tPersonEntity = new PersonEntity();//可以使用entity}}</span></span></span>

(二)、scope 属性:

1、compile:缺省值,适用于所有阶段,会随着项目一起发布。(编译、打包都会加入) 

2、provided:编译测试会加入此包,打包的时候不会加入。如 servlet.jar,一般指定为provided。 

3、runtime:编译就不依赖,只在运行时使用,如JDBC驱动,数据库等适用运行和测试阶段。

4、test:只在测试时使用,在编译和打包时都不会使用这个依赖。 

5、system:类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。


(三)依赖的传递

1、maven-common 依赖于 maven-entity ,那么maven-entity 所依赖的 hibernate 和 log4j包会传递依赖给 maven-common 。

2、传递的范围:只有scope 等于 compile的依赖才会被传递:如上,给loj4j 添加 <scope>test</scope>

<span style="font-family:Arial;font-size:18px;"><dependency><groupId>com.web-jar</groupId>  <artifactId>log4j</artifactId>  <version>1.2.15</version>  <scope>test</scope></dependency></span></span></span>

这样,log4j就不会传递依赖了。


(四)间接依赖

1、案例1:同级别

1)A模块依赖于M模块1.0版本(A-->M1.0),B-->M2.0;C-->A、B,那么C会依赖于M的哪个版本?

2)A、B对于M为直接依赖,C对于M为间接依赖。C对于M的依赖决定于C依赖的A、B在Pom文件中依赖的前后顺序,谁在前,就会间接依赖谁依赖的M版本。如A在前,则C依赖M的1.0版本,反之为M2,0版本。


2、案例2:非同级别

1)A-->G-->Z1.0;B-->Z2.0,C-->A、B并且,在C模块的pom文件中,A在B之前,那么C依赖于Z的哪个版本?

2)依赖 Z2.0 。这时的Z模块对于A都是间接依赖,但是 Z2.0 在间接的路径上较短,所以会依赖于 Z2.0 。


(五)限制依赖:<exclusions><exclusion>

1、如想限制Z2.0,就想依赖Z1.0,就可以在C 的pom文件中,B模块的依赖中排除 Z2,0:

<span style="font-family:Arial;font-size:18px;"><!--排除依赖--><dependency>      <groupId>${project.groupId}</groupId>    <artifactId>B</artifactId>    <version>${project.version}</version>    <exclusions>    <exclusion>    <groupId>Z</groupId>    <artifactId>Z</artifactId><!--不需要使用版本,因为在B模块中只有一个版本的Z-->    </exclusion>    </exclusions>    </dependency></span></span></span>



四、聚合和继承

(一)聚合:

1、一个项目如果有多个模块,需要对每个模块进行编译等工作,为了统一管理所有的模块,使用聚合。

2、

1)新建一个项目,勾选 create a simple project,不使用maven的 archetype 。


2)选择 packaging 为 pom



3)在maven-parent 模块的pom(超级Pom)文件中,使用 modules 关键字

<span style="font-family:Arial;font-size:18px;"><!-- 聚合是模块的位置 --><modules><module>../maven-common</module><module>../maven-entity</module></modules></span></span></span>

4)pom文件是在 maven-parent 模块中,如果把 pom 文件放在模块外,则可以去掉校对位置的标识。

5)聚合后,编译等工作只需要操作 maven-parent 模块即可。


(二)继承:<parent>

1、如果 maven-common 依赖hibernate,maven-entity也依赖hibernate,就需要分别在两个模块的pom文件中分别依赖于两个包,在实际项目中这种相同依赖的包会很多,那么需要引入继承的概念。

2、在 maven-parent 模块的pom文件中,加入hibernate 的依赖:

<span style="font-family:Arial;font-size:18px;"><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><dependency><groupId>com.web-jar</groupId><artifactId>hibernate-jpa</artifactId><version>2.0-api-1.0.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId><artifactId>hibernate-core</artifactId><version>4.2.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId><artifactId>hibernate-commons-annotations</artifactId><version>4.0.1.Final</version></dependency><dependency><groupId>com.web-jar</groupId><artifactId>log4j</artifactId><version>1.2.15</version><scope>test</scope></dependency></dependencies></span></span></span>

3、分别在maven-common 和 maven-entity 两个模块中,只要继承 maven-parent 模块就可以是实现 hibernate的依赖:

<span style="font-family:Arial;font-size:18px;"><parent><groupId>JavaMaven</groupId><artifactId>maven-parent</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../maven-parent/pom.xml</relativePath></parent></span></span>


0 0