Maven入门笔记

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,实在是不应该。目前只是就着自己在项目中的应用总结了下,如有不对的地方,还请指正,共同学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值