首页 > 代码库 > Maven的学习

Maven的学习

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的学习