Maven学习笔记
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
下载Maven http://maven.apache.org/download.cgi
配置Maven
- 将下载好的Maven解压缩后放在D盘中
- 在高级系统设置中配置环境变量,修改path环境变量
;C:\service\apache-maven-3.6.2\bin;将位置信息指向文件夹bin中即可,在path中加入这段话
- 测试是否安装成功
mvc -version会得到相关的版本信息
手工创建一个Maven工程,大概了解一下Maven组成和编译
结构图 |
在HelloWorld文件中/src/main/java/com/king下创建HelloWorld.java文件
package com.king; public class HelloWorld{ public static void main(String[] args){ System.out.println("Maven构建成功"); } } |
将pom.xml配置文件拷贝到工程的根目录下/HelloWorld
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> <!--POM版本4.0.0--> <groupId>com.kingsoft.HelloWorld</groupId> <!--一般是某公司或组织的某一个项目--> <artifactId>HelloWorld</artifactId> <!--某个项目的具体模块--> <version>0.0.1-SNAPSHOT</version> <!--项目版本-->
<dependencies>
</dependencies> </project> |
运行maven项目
需要使用dos模式,进入到工程根目录下执行maven操作
D:\HelloWorld> mvn compile 编译
进行编译,下载的maven仓库下载到C:\Users\Administrator\.m2(默认位置) 说明已经编译成功,编译完成的.class文件会存放在HelloWorld文件夹的target文件夹中(自动生成) 注意:mvn compile只编译src/main文件夹下的.java文件 |
mvn clean (清空):会把target文件夹以及文件夹下生成的.class文件一起删除
mvn test (测试):会把src下的main,test下的所有.java文件编译,首先创建文件夹target,并将编译号的二进制.class文件放入其中
mvn package(打包):本人测试得出结论,如果使用mvn clean将target(编译后的.class文件夹)删除,在执行打包操作时maven会先执行编译(src下的main,test),然后在开始打包。
生成的文件名称一般为:HelloWorld-0.0.1-SNAPSHOT.jar
mvn install(把项目安装到本地仓库):本人测试得出结论,如果使用mvn clean将target(编译后的.class文件夹)删除,在执行安装操作时maven会先执行编译(src下的main,test),然后在开始打包生成HelloWorld-0.0.1-SNAPSHOT.jar文件,同时在本地仓库中创建编译好的工程
Maven本地仓库迁出默认的C盘
- 在D盘创建一个myMaven的文件夹
- 找到maven安装文件夹中的conf文件夹,修改setting.xml文件
<!--自定义的Maven仓库位置 2019.10.13--> <localRepository>D:\myMaven\repository</localRepository>
将上面的的配置信息拷贝到被注释的 <!-- <localRepository>/path/to/local/repo</localRepository> --> 信息下边,保存即可 这样在编译maven项目时,会自动将所需的jar文件下载到这个文件夹下 |
- 再次编译项目 mvn compile就可以将所需的jar文件下载到指定的文件夹下
- 将C:\Users\Administrator\.m2的repository删除即可
使用Eclipse创建Maven项目
- 拷贝一份setting.xml文件,其中指定的仓库位置为D:\myMaven\repository
- 配置maven,在Eclipse中找到WindowàPreferencesàMavenàUser Settings
本人习惯将全局和用户全部指向setting.xml文件,这时Local Repository会自动找到配置信息中的仓库位置 保存即可完成配置。 |
- 在空白处单击右键,New --> Other -->
|
- 创建Maven工程
单击Next
选择Maven的技术骨架(quickstart)这种生成jar文件,单击Next
填写pom.xml的配置信息如上图所示 |
配置下载jar包的同时下载源码和文档
|
修改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.kingsoft.afarm</groupId> <artifactId>helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> //打包后生成jar文件
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project> |
测试一下生成的maven工程
在main和test下创建两个java文件 |
HelloWorld.java
package com.kingsoft.afarm.helloworld;
public class HelloWorld { public String sayHello() { return "hello world"; }
public static void main(String[] args) { System.out.println(new HelloWorld().sayHello()); } } |
HelloWorldTest.java
package com.kingsoft.afarm.helloworld; import static org.junit.Assert.assertEquals; import org.junit.Test;
public class HelloWorldTest {
@Test public void testSayHello() { HelloWorld helloWorld = new HelloWorld(); String result = helloWorld.sayHello(); assertEquals("hello world", result); } } |
打包前可以进行编译和测试
在pom.xml文件上单击右键 -->Run As其中包含了clean/ install/ test/ build
前面3个功能和敲命令时是一样的,不同的是build
输入package后单击Run即可完成编译和打包过程,并在target文件夹下生成jar包 |
Maven的依赖特性
依赖的传递性:User-service依赖Spring-core,Spring-core又依赖Commons-logging,这时User-service与Commons-logging就发生了依赖的传递。 |
使用时的说明:
创建2个工程,分别由两个人做并行开发,人员A开发user-dao,人员B开发user-service 当user-dao开发完成后只需打包,而user-service只需引入调用即可 |
user-dao项目中单击pom.xml右键,Run AsàMaven install后,即可在Maven仓库中生成
user-dao-0.0.1-SNAPSHOT.jar文件以供其他工程引用。
例如user-service要引用user-dao工程,则需要在pom.xml文件中配置
user-dao的pom.xml
<groupId>com.kingsoft.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> |
user-service的pom.xml
<!-- 引入自定义的jar --> <dependency> <groupId>com.kingsoft.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> |
Maven的聚合
多个模块由一个模块进行统一的管理
项目user-dao和user-service统一交给user-web管理 |
配置信息如下
在user-web的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.kingsoft.user</groupId> <artifactId>user-web</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
<modules> <module>../user-dao</module> //同级目录使用../退回到上一级 <module>../user-service</module> </modules> </project> |
只需要操作user-web即可完成对user-servcie和user-dao的操作,例如clean install
Maven的继承
用于统一管理版本
如果很多工程都引入自己的jar包和版本号很容易造成版本的冲突,如果使用父类统一管理版本号,就不会发生冲突。 |
创建一个user-parent父类的maven的pom工程(不需要架构)
修改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.kingsoft.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> //资源信息,用于统一管理版本 <properties> <spring.version>4.1.7.RELEASE</spring.version> <junit.version>4.12</junit.version> <mybatis.version>3.3.0</mybatis.version> <mysql.version>5.1.40</mysql.version> <log4j.version>1.2.17</log4j.version> <mybatis-spring.version>1.2.3</mybatis-spring.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> 调用资源信息中的名称,加入${} <scope>test</scope> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency>
<!-- spring包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> </dependencies> </dependencyManagement> </project> |
修改子类的user-dao项目的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>
<!-- 继承父类节点 --> <parent> <groupId>com.kingsoft.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../user-parent/pom.xml</relativePath> </parent>
<!-- 子类中的声明只需要保留一下两条 --> <artifactId>user-dao</artifactId> <packaging>jar</packaging>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> //子类中不需要指定版本号,都由父类统一管理 <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> </dependencies> </project>
|
Maven依赖的范围
classpath分为三种:编译classpath, 测试classpath,运行classpath
scope选项如下:
Compile:编译依赖范围,如果不加scope范围,默认就是Compile,这个范围在编译,测试,运行都有效
Test:测试范围有效,例如junit
Provided:已提供依赖范围。编译,测试有效,运行时无效,例如servlet-api,如果在打包中最好将serlvet-api的引用设置成provided,因为tomcat本身就有serlvet-api的jar包,如果导出的工程中有servlet-api可能会与tomcat的jar包发生冲突。