Maven入门
一、maven配置
1、安装maven后,配置环境变量
添加M2_HOME、添加PATH
这里需要说明的是,maven依赖jdk,所以如果没有安装或者没有配置jdk环境变量的话,先配置jdk环境变量。
2、配置settings.xml
这里主要配置本地maven仓库,以存放一些jar包。
新建个文件夹,任意位置,我是建立在maven安装目录下,如叫MyRepository,复制当前路径。
打开maven安装目录,找到conf/settings.xml,编辑,找到注释掉的 ,将其取消注释,并配置成刚才复制的maven仓库地址。
打开cmd,输入mvn -version,如果安装成功,这里会显示当前maven的版本信息。
二、Eclipse集成maven
eclipse里一般都呆了maven插件,但是其版本不一定是我们想要的,这里我们改成自己安装的maven。
打开Eclipse,依次打开Windows-Preferences-Maven,如果这里找不到Maven,可能是你的Eclipse没有安装maven插件,那么先自行百度安装。
点开Maven节点,点击Installations,点击add,找到我们的maven安装地址,点击确定。
然后会发现Eclipse已经为我们选择了我们自己安装的maven。接来点击Maven节点下的User Settings,点击Browse选择我们安装的maven里conf/settings.xml,然后会发现下面的Local Repository也改成了我们在xml中配置的路径。点击OK,这里就配置好了。
三、新建maven工程
Eclipse里右击,New-Other-Maven-Maven Project,点击next,选择ArcheType,一般默认选项(maven-archetype-quickstart)就好,点击next,输入Group Id、Artifact Id和Package。
Group Id:组织编号,一般是你所在公司或者组织域名的倒写,比如我是百度的,这里就可以写com.baidu,可以随意。
Artifact Id:项目编号,这个就类似我们的项目名称,自己起一个。
Package:打包时候,后缀名,可以是jar、war等等。
点击ok就建好了。
关于maven的目录结构,对于初学者的我,看这很别扭。不过可以先忽略,一般java源文件都写在路径src/main/java下,在里面可以像之前一样建package等等。
当然最主要的还是在pom.xml中添加依赖,这是maven的精华之一,我们重点说下。
四、添加依赖和打包
1、添加依赖
通常添加依赖比较简单,只需要在pom里的dependencies里添加某个dependency即可,例如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
通常而言,你需要的jar包,都可以在http://mvnrepository.com/里找到,输入关键字搜索,找到合适的jar,下面就给出了格式化好的代码,直接复制即可。
有时候我们的网速不给力,尤其是eclipse帮我们下载jar包时更不给力,可能会出现一直在Downloading,甚至因down不下来而导致pom报错。这时我们可以自己去maven仓库中将对应版本的jar下下来,然后放到我们之前配置的本地仓库中,对应的路径下,然后在回来刷新下工程,或者maven-update dependency即可。
2、打包
maven默认的打包不会把依赖的jar包打进去,但通常而言我们是需要把pom中依赖的jar包都打进发布的jar中的。这里借助一个插件,maven-assembly,引入方式很简单,直接在pom中加入
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>xxx.xxx.XXX</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意build元素和是同一级别,都是的子元素。
一般而言需要修改的地方只有
<mainClass>xxx.xxx.XXX</mainClass>
即指定你工程的入口main class。
添加完之后,可以右击我们的project,依次选择Run As-maven install或者maven package即可,打包完成后,在当前项目下的target文件夹下,即有打包好的工程文件,且是包含了依赖的。
3、常见问题
现在有两个问题,分别是:
1、有个jar包A,我只在编译是需要,打包发布时不需要,该如何处理?比如一个web工程,我在编译时需要servlet-api.jar,否则无法编译,但是在打包成war时,我并不希望把这个jar包也打进去,因为我的容器如tomcat会提供这个jar包,这时候该怎么办?
2、假设我依赖的一个jar包A和B,我只要在pom添加A和B的依赖即可。但碰巧的是,A也依赖了B,但是A依赖的B的版本是v1,而我这里需要的B是v2,这时候我发现maven dependencies同时出现了这两个jar,这很可能在我运行时出现jar包冲突,这时候又该怎么办?
当然maven的设计者已经为我们考虑了这样的问题,并提供了解决方案。对于问题1,可以再添加依赖时,通过scope元素来达到我们的目的。例如我当前在编写一个storm程序,在编译时,我需要加入storm依赖,但是在发布时,我会把我的project放到storm容器中跑,storm环境提供了需要的jar包,这时我就不用再把相应的jar打包进我的项目中,这时我通过添加scope元素,并制定为provided,即可。代码如下:
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.0.1</version>
<scope>provided</scope>
</dependency>
provided的意思是,编译时需要,打包时不需要,因为我的环境已经provide了该依赖的支持。scope可选配置很多,如test、compile等,默认的就是compile,我也不是十分了解,需要的请自行百度。
对于问题2,则需要在添加A依赖时,通过exclusions配置来将A依赖的B给排除出去,这样打包的project中只有我们配置的B,而且也不用担心A找不到B,因为我们自己配置了B的依赖。当然这里还是要注意一下版本问题,如果A中依赖的B和我们自己配置的B版本差距太大,比如一些方法在新版本中才有,那么我们就需要做下调整,具体的看各自的需求吧,只要你理解了,这里应该可以自己解决。
同样以我的storm程序为例,我依赖的一个jar是storm-kafka,它又依赖了slf4j,而我的其他jar包也包含了该依赖,这时我就需要在storm-kafka中,将slf4j给排除出去,配置如下:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.8.2.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
这里排除了两个jar包。
之后,我们在执行maven package,就不会再出现上面的问题了。
注:笔者虽然学习java有段时间,但是却才接触maven,实在是不应该。目前只是就着自己在项目中的应用总结了下,如有不对的地方,还请指正,共同学习。