MAVEN
POM详解
POM作为Maven的项目对象模型主要包含了三个部分:基本信息、依赖管理、构建。
基本信息
POM的基本信息用来描述整个项目或模块的内容。主要有以下几个部分组成:
标签 | 描述 |
<groupId> | 组织ID一般使用包名 |
<artifactId> | 项目名或模块名 |
<version> | 项目或模块的版本号:一般使用SNAPSHOT(快照版/开发版)、RELEASE(发布版/正式版)也可自定义。 |
<packaging> | 打包类型,常见值为:jar、war、pom |
Maven通过groupId+artifactId+version来确定project的位置。简单来说Maven是通过POM中的基本信息来定位project的位置。
依赖管理(dependencies)
Maven的POM与POM之间存在三种关系、依赖、继承、聚合。
依赖(dependencie)
当前Maven项目(A)需要依赖另一个Maven项目(B)那么我们就可以说A依赖于B(我们之前配置的Jar文件的坐标(依赖)信息实际上就是一个Maven项目)。
POM的依赖主要靠以下标签进行依赖的定位:
<dependencie>
<groupId>依赖项的groupId</groupId>
<artifactId>依赖项的artifactId</artifactId>
<version>依赖项的版本</version>
<scope>依赖项的作用域</scope>
<exclusions>排除依赖冲突时使用</exclusions>
</dependencie>
查看依赖网址:https://mvnrepository.com/
scope作用域(重点)
compile默认值(缺省值)
编译时生效,伴随Maven的整个生命周期。
provided期望
类似compile,期望JDK、使用者或容器会提供相关依赖(当我们项目需要编译或开发时需要使用该依赖、但是在部署运行时其它容器会提供相关依赖时我们进行provided配置,否则会出现依赖冲突)。例如:Servlet.jar应用服务器会提供相关依赖。
runtime运行
只在运行时生效。
test测试
只在测试时生效,不会随项目发布。
system系统本地
当maven的Repository内不存在时使用。某些项目并未使用Maven,但我们需要使用时会导致我们无法从Repository中获取对应依赖的坐标信息,我们可以把对应jar存放到WEB-INF/lib中进行引用。可以使用私服解决。
依赖冲突解决(了解)
当A和B同时依赖于C,但A和B依赖的C的版本不同时就会出现依赖版本冲突的问题。
插件方式(了解)
<reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </plugin> </plugins> </reporting> |
运行:mvn project-info-reports:dependencies 查看依赖报告进行解决。
Eclipse插件
解决原则
1、声明优先(自动)。
2、路径优先(自动)。
3、排除依赖(手动)。
4、锁定依赖(手动)。
当发生依赖冲突时Maven进行自动处理,当Maven解决不了的时候需要我们进行手动排除的操作。
锁定依赖:
配置锁定依赖并不是真正依赖,只是我们在配置依赖时不需要指定依赖的版本信息。
继承
Maven多模块开发时parent内的依赖,对应的子模块也会拥有。
聚合
Maven多模块开发时在父模块中聚合个个子模块。
属性
属性表述类似EL表达式,使用<properties>标签来定义属性的引用。
构建(build)
当项目进行到构建阶段时,我们需要在POM中的<build>内进行项目在构建时的一些设置。
插件(Plugin)
<plugins>
<plugin></plugin>
</plugins>
资源(resources)
通过<resources>指定在构建时需要的资源文件。
resources:一个resource元素的列表,每一个都描述与项目关联的文件是什么和在哪里;
targetPath:指定build后的resource存放的文件夹。该路径默认是basedir。通常被打包在JAR中的resources的目标路径为META-INF;
filtering:true/false,表示为这个resource,filter是否激活。
directory:定义resource所在的文件夹,默认为${basedir}/src/main/resources;
includes:指定作为resource的文件的匹配模式,用*作为通配符;
excludes:指定哪些文件被忽略,如果一个文件同时符合includes和excludes,则excludes生效;
testResources:定义和resource类似,但只在test时使用,默认的test
resource文件夹路径是${basedir}/src/test/resources,test resource不被部署。
多模块
在项目开发中如果代码放到一个Maven项目中,在多人开发时,容易出现冲突,可以使用到Maven的聚合项目进行分模块开发,减少冲突的发生。
模块划分
Maven的模块划分一般遵照2个原则:分层模块、业务模块。某些大型项目会结合使用。
步骤
1、创建父项目,将父项目的packageing设置为pom。
2、创建子项目,使用<parent>标签将父项目信息引入。
3、父项目使用<modules>聚合各个子项目,并将项目第三方依赖信息配置到父项目内来控制依赖。
4、根据划分规则配置子模块间的相互依赖。
Eclipse创建
创建父项目
创建子模块
配置模块间的依赖关系
从案例中我们可以发现dao依赖于domain,service依赖于dao和domain,web依赖于service和domain。但应为Maven的POM具有继承性,我们只需将dao依赖于domain后,所有依赖于dao的pom都会有domain下的内容。
DAO模块
Service模块
Web模块
父POM(主POM)
命令创建
步骤
1、使用命令创建父项目,并将src目录删除,并修改pom中的packageing修改为pom。
2、进入父项目目录内,根据不同模块的打包格式,运行maven命令创建子模块(Maven会自动将对应模块聚合到父项目内,要保证执行子模块命令时在父项目下)。
3、导入Eclipse中并,配置模块间的依赖关系。
创建命令
父项目(创建完成后删除src并修改packageing为pom): mvn archetype:generate -DgroupId=com.dj.ssh -DartifactId=maven_ssh -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false |
子项目(进入父项目目录内执行): mvn archetype:generate -DgroupId=com.dj.ssh -DartifactId=maven_ssh_domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false mvn archetype:generate -DgroupId=com.dj.ssh -DartifactId=maven_ssh_dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false mvn archetype:generate -DgroupId=com.dj.ssh -DartifactId=maven_ssh_service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false mvn archetype:generate -DgroupId=com.dj.ssh -DartifactId=maven_ssh_web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false |
私服(了解)
一般情况下,各个公司的开发团队为了提高开发效率,都会使用项目构建工具进行开发。一般情况下都需要管理各种依赖的插件,需要频繁连接服务器。而考虑到开发效率,就需要搭建私服(公司在自己的局域网内搭建的远程仓库服务器,称为私服)。
使用私服的好处:
节省外网带宽。
加速Maven构建,提高效率。
内部部署构件。
灵活的安全和权限管理。
下载/安装
私服构建工具:NEXUS。
下载地址:https://www.sonatype.com/download-oss-sonatype
配置环境变量
1、新增NEXUS_HOME=nexus解压目录。
2、PATH中增加%NEXUS_HOME%\bin。
运行
在cmd中输出:nexus.exe/run
等启动完毕后,在浏览器中出入:http://localhost:8081/
默认用户名/密码:admin/admin123
在nexus目录中etc下nexus-default.properties可以修改访问端口。
配置
1、修改本地Maven的setting.xml,将镜像配置改为私服地址。
2、POM中新增私服信息。
总结
常用命令
查看Maven版本:mvn -v / mvn -version
创建项目:mvn archetype:generate
编译:mvn compile
清除:mvn clean
打包:mvn package
安装:mvn install
发布:mvn deploy
运行:mvn tomcat:run、mvn tomcat7:run、mvn jetty:run(根据POM中配置的不同插件选择)
(注意:在Eclipse中使用去掉mvn)
在进行 compile、package、install、deploy或运行命令时一般和clean组合使用并且可以加入参数:
跳过测试 -Dmaven.test.skip=true
强制更新快照 -U
compile、package、install、deploy区别:
1、compile只会编译类文件,不会打包。
2、package只会将包生成到target内。
3、install会将target内的包安装到本地仓库。
4、deploy会将target内的包安装到本地仓库并且上传到私服(POM文件需要配置)。