Maven快速入门

Maven是Java中最为普及的包管理工具,在实际项目中由于依赖的各类jar包非常多,因此概念清晰的处理好各类Jar依赖显得非常重要,接下来通过基础知识,Jar包主要分类方式和进阶知识来介绍。

基础知识

Maven使用起来非常方便,配置卸载setting.xml中,如果是自己本地开发,推荐直接使用如下配置。



E:\javaAssist\maven\repository








alimaven
central
aliyun maven
http://maven.aliyun.com/nexus/content/repositories/central/



repo1
central
Human Readable Name for this Mirror.
http://repo1.maven.org/maven2/



repo2
central
Human Readable Name for this Mirror.
http://repo2.maven.org/maven2/




常见命令

命令 诠释
mvn package 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
mvn tomcat7:run 运行项目于tomcat[jetty等server也OK]上
mvn compile 编译
mvn test 编译并测试
mvn deploy -Dmaven.test.skip=true 发布
mvn clean 清空生成的文件
mvn install -X 想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行
Tip: 对于community版本的Idea就需要借助maven命令来启动tomcat容器。
此外生产环境,有时会指定特殊版本的jar,因此需要使用systemscope,如下所示


com.xxxxx.security
encryption
1.0.0.2
system
${project.basedir}/src/main/resources/lib/encryption-1.0.0.2.jar

Maven的Scope

名称 诠释
compile 编译范围,默认的范围
provided 已提供范围,比如有些web相关jar,tomcat中有,但本地没有时使用
runtime 运行时范围,比如编译时只需要slf4j-api,运行时才需要具体的实现jar
test 测试范围,例如junit,spring-test

依赖库分类

在java项目中,通常我们将所有的库归类为三种:
一方库:指当前项目中各模块间的相互依赖,其中每个模块都可以定义为该工程的一方库。(工程范围内)
二方库:指当前公司内部jar包间的相互依赖,公司内部除了当前工程之外的jar及依赖都可以定义为该工程的二方库。(公司范围内)
三方库:指公司之外的开源库, 比如apache、google、spring等第三方提供的jar及依赖。

进阶知识

项目中经常遇到jar包冲突的问题,通常的都是遇到冲突后再去检查,很被动。即使是通过 mvn dependency:tree -Dverbose 也只能是从jar层面自己分析是否有冲突。如何提前检测,如何准确定位到具体类在哪个jar包中存在冲突,这才是解决问题的根本。现推荐一款maven插件可以具体定位到哪些类有冲突,在哪些jar包中有冲突。
使用方法
在pom.xml文件build标签中添加如下代码(根据自己代码视情况添加)




org.apache.maven.plugins
maven-enforcer-plugin
1.1.1


org.codehaus.mojo
extra-enforcer-rules
1.0-alpha-4




true


print("[INFO] [Alibaba Enforcer Rules] parent-pom ");1==1


true
[ERROR] [Alibaba Enforcer Rules] find DuplicateClasses





之后在对应项目根目录执行一下maven命令:mvn enforcer:enforce。冲突较多单屏无法显示完整时可以重定向到某文件中,如下:mvn enforcer:enforce > conflict.txt。其中Duplicate classes显示的是重复的类,Found in显示的是重复的类所在的jar包。此外,可以通过添加VM参数-verbose:class可显示每个文件加载自哪个jar包。

附上一个基础的Maven文件Demo


4.0.0
com.bjorktech.cayman
cm-web
war


cayman
com.bjorktech
1.0.0-SNAPSHOT



<jsp.version>2.3.1</jsp.version>
<jstl.version>1.2</jstl.version>
<servlet.version>3.1.0</servlet.version>



org.springframework
spring-webmvc



javax.servlet
jstl
${jstl.version}


javax.servlet
javax.servlet-api
${servlet.version}
provided


javax.servlet.jsp
javax.servlet.jsp-api
${jsp.version}
provided



org.springframework
spring-tx



org.springframework
spring-aop


org.aspectj
aspectjweaver


org.aspectj
aspectjrt
1.8.5



org.mybatis
mybatis


com.google.guava
guava


joda-time
joda-time



org.slf4j
slf4j-api


ch.qos.logback
logback-access


ch.qos.logback
logback-classic


ch.qos.logback
logback-core






com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.5.3


com.fasterxml.jackson.core
jackson-databind
2.5.3



commons-fileupload
commons-fileupload
1.3.1


commons-io
commons-io
2.3



javax.xml.rpc
javax.xml.rpc-api
1.1.1


org.apache.axis
axis
1.4



commons-discovery
commons-discovery
0.2


commons-logging
commons-logging




wsdl4j
wsdl4j
1.6.3



dom4j
dom4j
1.6.1



org.springframework
spring-test


junit
junit



cm-web


org.apache.maven.plugins
maven-compiler-plugin


org.apache.maven.plugins
maven-war-plugin


false




posted @ 2018-01-07 18:08  单排狙击  阅读(501)  评论(0)    收藏  举报