问题?Maven的使用《二》之依赖、继承、聚合
前面已经讲到了环境的搭建(环境搭建链接),这里就不重复了。下面的主要是对依赖、继承、聚合详细说明。
这里用的编译软件是eclipse,要装maven的插件(下载地址和安装方法:点击下载链接)。
然后装完后,这个时候插件已经在Preference里面了,但是插件还不能用,需要我们做一些设置。
一般来说,做到这里就可以用了。但是我在用的过程中会出现这样的一种错误(点击查看链接),经过查询资料,已经得到了很好的解决办法。做下面设置(把jir改成jdk格式的)
以上配置已经做完。
导入已有的maven工程:
新建maven工程:
模板一般选用:
新建javaWeb工程:
1.依赖关系:在工程之中需要依赖各种各样的jar包,也可能需要依赖其他的maven工程打包好的包。这个时候就需要使用依赖关系对pom.xml来进行配置。
pom.xml中配置:(标签的使用及作用,在上一节已经提及)
<dependency><!-- 这是依赖另外一个工程的格式,如果是依赖jar包的话要另外写-->
<groupId>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>test</scope><!-- 不指明的话,默认是compile(编译)-->
</dependency>
根据传递性依赖的原则:路径最近者优先路径相同,第一声明者优先。(相互继承,子工程会选择最近的一个父工程的jar包进行继承)
2.继承关系:懂得一点儿java的,都知道继承是什么,就是为了将公共的东西拿出来直接用。
继承为了消除重复,我们把很多相同的配置提取出来(比如在maven相互依赖的项目中,不同的项目中却有相同的jar包配置,那样不是显得非常多而且繁琐,每次都需要去配置它,很麻烦)
所以,maven提供了一个父类maven项目(新建工程Parent,目的消除子工程的配置文件中重复的内容,所以无需代码类,删除代码)来装所有公共使用的jar,只要继承都可以使用。
但是需要做点儿配置步骤:
假设子工程都需要用到了相同的junit版本4.9
(1)在父类工程的pom.xml中配置依赖的jar包
(2)在各个子工程中引入父工程即可<parent>,放在<denpendencies>上面,同时在所有子项目中Hello、HelloFriend、MakeFridens中删除重复的<groupId>、<version>、<dependency>
这个时候就不需要子工程的pom.xml文件配置公共的jar包了。
<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
(3)修改父工程中的pom.xml
<packaging>jar</packaging> 改为 <packaging>pom</packaging>
这是一个父工程,实际是一个聚合工程,它没有实际代码,它的作用是抽象出子工程公用的内容
不加的话会报这样的错误;
Project build error: Invalid packaging for parent POM cn.itcast.maven.HelloParent:0.0.1-SNAPSHOT, must be "pom" but is "jar"
3.聚合关系:在java中我们也可以知道,就是在完成某一个模块的时候,它需要几个模块的公共工作才能完成(不是组合关系)。
在上面的继承关系中,我们从父工程依次执行mvn install命令,那么它就没问题,因为依次都打包到本地仓库中去了,子工程要依赖父工程的包,自然也就没问题,但是当我们反过来做就会出问题。解决这个问题依次这样执行,就会变得很繁琐,这个时候我们的maven的聚合出现了,它就是为此问题而存在。
如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合,这样做,我们只需要对父工程进行mvn install命令,它就会依次把继承依赖的所有工程都自动执行mvn clean test compile package install命令了。怎么样很方便吧!这就是mvn的强大之处。
它也需要做点儿pom.xml配置:只需要在父工程中配置
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
<module>../HelloWeb</module>
</modules>
这样就无需一个一个的安装 mvn install,只需要父工程的 pom.xml 上 Run As,就会连同全部一起进行安装。
<modules><module>…</module></modules>
代码:
父工程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>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Parent</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
<module>../HelloWeb</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<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>cn.itcast.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
</project>
<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>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name>
<!-- 公司信息 -->
<organization>
<name>北京传智播客教育科技有限公司</name>
<url>http://www.itcast.cn/</url>
</organization>
<!-- 研发人员列表 -->
<developers>
<developer>
<id>weichen</id>
<name>陈伟</name>
<email>weichen@163.com</email>
<roles>
<role>研发经理</role>
<role>研发工程师</role>
</roles>
</developer>
</developers>
<!-- 贡献人列表 -->
<contributors>
<contributor>
<name>胡莹莹</name>
<email>huyingying@163.com</email>
<roles><role>研发工程师</role></roles>
</contributor>
</contributors>
<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
<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>cn.itcast.maven</groupId>
<artifactId>MakeFriends</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MakeFriends</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>