码迷,mamicode.com
首页 > 其他好文 > 详细

Maven的学习

时间:2017-06-08 00:21:55      阅读:365      评论:0      收藏:0      [点我收藏+]

标签:管理工具   connector   mave   ima   api   code   pen   支持   logs   

Maven是Apache的一个项目,它使用对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。集项目的构建,清理,编译等于一体,以前我们在使用IDE时,基本上一键就可以完成很多功能(编译,运行),而对其内部并不了解,虽然Maven不是作为让我们了解这些过程的工具,但其带来了一些好处却很有意义:比如说以前我们构建项目时,需要拷贝大量的jar包,虽然挺方便,复制粘贴,但是存在潜在问题,多个版本的冲突问题,不同开发者版本不一致的问题等等,而Maven可以帮助我们解决这些问题

Maven的下载与安装

我们在Maven官网(https://maven.apache.org/)下载之后,直接解压缩即可,是免安装的,我个人其实挺喜欢免安装的。下来是配置环境变量:

技术分享

 

配置MAVEN_HOME到其解压缩的目录,值得注意的一点是:Maven需要JDK的支持,所以在使用之前一定要有JAVA_HONE的配置。

最后一步是在path中配置:(以便可以在cmd中使用Maven命令)

技术分享

 

验证是否配置完成的方法是:在cmd中输入:mvn -v   可以输出版本信息就表示配置完成了,这也是我学到的第一个Maven命令

 

Maven的目录结构

了解一下Maven的目录结构,是有好处的:

技术分享

 

conf文件夹中有一个settings.xml文件,我们一会要修改一下其中的配置

 

Maven的工作方式

Maven项目的是非常小的,因为web项目中占大头的就是jar包,Maven就对这一部分进行采用依赖的概念,所谓依赖就是只根据jar包的坐标信息就可以了,而不使用复制jar的方式。这就引发了另一个概念——坐标:坐标就是标识一个jar包的信息,通过这些信息表示jar

坐标信息由:groupId和artifactId,version信息构成。基本上我们的Maven项目也是根据这三者进行标识的,groupid表示公司域名反写,artifactid表示项目名,version表示版本

web项目中的jar都根据配置信息表示了,那是不是说我们不需要jar包就可以运行项目了?

并不是这样的,Maven需要在你的本地仓库中查找jar,如果没有就在你的Maven私服中的查找,如果还没有就去Maven的中央仓库中查找并下载到你的本地仓库。仓库就是存放jar的地方

技术分享

 

虽然我们并不是通过复制/导入的方式s使用jar包,但你在本地测试时还是需要jar的支持,不然怎么运行

 

构建本地仓库

这是时候就需要我们修改那个settings.xml文件了,打开找到下面的标签,修改为你的本地仓库:

技术分享

 

 

本地仓库也不是说放一个jar包就可以了,还需要一些配置信息(这是一个mysql连接驱动)

技术分享

我们再来看一个Maven项目的目录,是Maven项目,不是Maven的目录(这个pom.xml很重要,我们配置jar坐标就要在这里):

技术分享

target目录就是我们编译过后class文件和xml文件所在了

 

常见Maven命令

Maven命令都是使用 mvn开头的 ,如 mvn -clean

技术分享

 

技术分享

 

Maven的生命周期

技术分享

 

 

 

Maven在IDE中的使用(这里使用Eclipse)

首先保证你使用Eclipse的JRE是JDK中的JRE,如果使用的是普通的jre是会有一个关于JDK的异常出现,在外面的jre和jdk中的jre还是有一些区别的,因为Maven要使用JDK,所以一定要使用JDK中的JRE

1.配置成我们下载的Maven

对了,如果你使用的Eclipse版本太低,设置中是没有Maven选项的,需要先安装一个Maven插件

技术分享

 

 

2.配置User settings

技术分享

配置成我们修改过的Maven中的settings.xml文件,同时下面也会找到我们的本地仓库

 

3.生成一个Maven项目

3.1右键new一个Maven项目

技术分享

 

选择Maven Project就可以了

3.2然后就到了下面的页面:

技术分享

 

勾选第一个选项,表示使用一个简易设置生成Maven项目,即使不勾选,自己去选一个Maven设置,其生成的Maven项目也不完整,还不如简单点

3.3填写一些Maven信息,这里可以看到要填写的是这个Maven项目的坐标

技术分享

之后final就可以了

 

生成Maven项目出现的问题

1.web.xml文件的缺失

Maven自动生成的项目没有web.xml文件,我们需要添加:

技术分享

 

这里使用了Eclipse的工具添加,当然,你也可以自己进行添加,添加到src/main/webapp下,记得web.xml文件要在WEB-INF文件夹中,也就是说要先添加WEB-INF,再在WEB-INF中添加web.xml

 

2.JDK版本不一致

自动生成的Maven项目中使用的JDK虽然是我们在Eclipse中配置的,但显示的名称却不一致,我们需要改一致(我是用的JDK1.8)。在pom.xml文件中配置maven-compiler-plugin这个插件:

 

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>

 

我们可以在pom.xml文件右键添加插件

技术分享

 

 

3.配置了1.8这么高的版本,还需要我们配置一下编译的Tomcat

添加tomcat7-maven-plugin插件:

 

 

            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>

 

可以使用右键添加插件的方式

 

一会我们要使用tomcat7:run命令(如果使用tomcat8会不会去下载tomcat8?)来执行,tomcat7就可以使用JDK1.8了,而如果使用tomcat:run默认使用的tomcat6的版本,不支持1.8,只支持到1.7

 

4.xml文件竟然不会找不到

我们还需要添加配置指定我们的xml文件复制到编译的target\classes,不然SSH整合时会找不到那些xml文件

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>

不论resources还是plugin节点都需要放在build节点下,实际操作会发现

 

解决了这么多问题,开始运行

到运行了嘛?很遗憾还没有,因为可能存在找不到Servlet和jsp的jar,下来我们需要添加这两个jar的坐标:

 

        <!-- Servlet&JSP -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.2-b02</version>
            <scope>provided</scope>
        </dependency>

 

jar的坐标都需要放在dependencies节点下,可以使用右键的方式,方法和添加插件类似,只不过使用的是Add Dependency选项。

技术分享

这里Servlet和JSP的jar都使用了scope指定其范围,可以指定的范围有:

技术分享

 

Servlet和JSP的jar包不需要在运行时使用,因为Tomcat中有相应jar,会冲突。我们可以根据要添加的jar选择其范围,默认是compile

到现在我们竟然还不知道Java代码和xml文件,web页面放到哪里?

java代码放在src/main/java  

xml可以放在src/main/resources  

测试java代码放在src/test/java

测试资源和文件放在src/test/resources

web页面可以放在src/main/webapp

 

在运行之前update一下Maven项目,这是倒数第二步哦:

技术分享

开始使用tomcat7:run运行吧

技术分享

 

技术分享

在这里也可以使用clean 或package等命令

 

如果使用Debug还需要在Source视图中把我们的项目添加进去,不然断点是不起作用的:

技术分享

 

使用MavenSSH的整合

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>cn.lynu</groupId>
    <artifactId>03_SSHTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
        
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
        
    </build>


    <dependencies>
        <!-- Servlet&JSP -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.2-b02</version>
            <scope>provided</scope>
        </dependency>

        <!-- Struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.32</version>
        </dependency>
        <!--struts2-spring-plugin -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.32</version>
        </dependency>

        <!-- Spring -->
        <!--spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!--spring-expression -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>

        <!-- Hibernate -->
        <!--hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.10.Final</version>
        </dependency>
        <!--hibernate-jpamodelgen -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>5.2.10.Final</version>
        </dependency>

        <!-- 其他 -->
        <!--jandex -->
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.0.3.Final</version>
        </dependency>
        <!--javassist -->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.21.0-GA</version>
        </dependency>
        <!--jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--standard -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!--aopalliance -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <!--mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.42</version>
        </dependency>
        <!--c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
    </dependencies>
</project>

添加这么多的jar,如何处理的jar包版本冲突的?

Maven使用两条原则:

1.谁先声明,就是使用谁

2.选择路径最短的:比如两条路径A-B-C  D-C  第一条路径的C版本为1.0,第二条路径的C版本是1.1,就会使用路径最短的1.1版本

如果还是不能解决版本冲突,也可以使用版本锁定:

    <dependencyManagement>
      <dependencies>
       <dependency>
             <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
       </dependency>
      </dependencies>
    </dependencyManagement>

锁定为要使用的版本坐标

 

其他的和我们使用的普通项目没什么不同,只是代码放的位置不同,因为Maven项目的结构就与普通项目不同

 

Maven的学习

标签:管理工具   connector   mave   ima   api   code   pen   支持   logs   

原文地址:http://www.cnblogs.com/lz2017/p/6959481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!