首页 > 代码库 > 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的学习