首先去到Maven官网进行下载,点击DownLoad进入下载界面
选择红线里面的那个下载就可以了,下载之后解压就好了。
打开解压后的文件中的conf文件夹的setting.xml文件,首先在大约53行的位置有一行用红色圈出来的代码,这个是默认的本地仓库,我们对其路径进行修改,首先将他剪切出来,在下面粘贴,将其修改成解压路径下的repo文件夹。
之后修改镜像信息,因为在使用Maven的时候如果需要的依赖不在本地仓库的话,会需要在联网的条件下从中央仓库下载,但是那样的话下载速度会比较慢,所以我们将其修改成从阿里云镜像仓库下载。红笔是xml原来的配置,我们在下面加上绿色的那段代码就可以了。
代码如下:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
修改结束之后,保存退出,在刚才设定仓库路径下建立repo包,并将setting.xml文件复制到repo文件夹下。
新添一个MAVEN_HOME环境变量,填入解压路径
之后在Path路径里面添加MAVEN_HOME变量,这里最好放到jdk变量下面(紧贴)
添加好之后,打开cmd或者直接在地址栏输入cmd进入,输入mvn -version就可以看到版本号及相关信息,这表示Maven已经成功配置
如果你的环境变量MAVEN_HOME不是紧贴在jdk变量放置的话,有可能会出现只能从地址栏访问而不能直接在cmd下查询的情况;另外,还有可能在cmd查询的时候出现mvn不是内部命令的情况,这个时候可以试一下以管理员身份打开cmd,应该就可以查询到了。
打开IDEA,在Configure选择Settings选项,输入maven打开配置界面,将Maven home directory里路径修改成解压路径,之后点击下面两个Override的勾选,自行配置,第一个修改成setting.xml的路径,第二个修改成新建的repo文件夹路径。然后点击OK完成设置。
创建Maven项目,勾选Create From archetype,下面全部都是Maven提供的骨架,我们找到红线画出的这个maven-archetype-webapp,这里一定要注意,上面还有一个cocoon-22-archetype-webapp,千万不要选错。如果对每个模板都想大致了解一下的话,可以看下这篇文章Maven 三种archetype说明。
点击Next进入,选择文件放置地址,起一个项目名,Next。
选择Maven相关配置,点击finish完成配置,打开项目。
从这步开始,你要确保你的电脑一定要是联网的状态。因为如果是第一次创建Maven项目,会从中央仓库下载大量的文件到你的本地仓库(你所创建的repo包),该过程很慢,我当时也下载了二十分钟左右,所以不要着急。如果你不是第一次打开的话,点击右下角的Enable Auto-Import直接完成配置。
完成之后,可以看下项目基本的目录结构。与之前直接创建的JavaWeb项目不同的是,这里没有lib文件夹,而是多了一个pom.xml,在这里我们也能看出Maven的强大之处,利用位置定位的方式解决jar包引用带来的项目过大的问题,以及对jar包冲突问题的完美解决。
首先,在main下创建两个Directory,分别是java和resources,在这里要注意一件事情,因为我并不是第一次部署,所以能够直接选择这两种Directory,可以在下下图中看到,这两个文件夹的颜色是不一样的,因为java是用来放置源代码的,而resources是用来放置项目的资源,比如说 property文件。
所以如果是第一次的话,需要将java修改成Sources Root,将resources修改成Resources Root。
先新建一个Servlet,我这里为了省事,没有创建package。
在这里可能会出现没有新建Servlet这个选项,点击File->Project Structure->Facets,将最下面的Sources Root那两个选项全部勾选就可以了。
新建完Servlet之后,现将web.xml中servlet-mapping配置完全。
然后在Servlet里面写一个最基本的页面跳转。这些红字暂时不用管,因为没有部署依赖,所以肯定会报错。
然后写一个跳转的hello.jsp,内容就随便写点什么就好
首先先了解一下pom.xml中的结构,想详细的了解去看pom.xml的详解,这里就提两个现在用得上的,首先是依赖关系列表dependencies,这里用启动Maven项目时自带的Junit依赖进行说明
<dependencies> //在里面配置所有依赖
<dependency> //一个基本依赖关系
<groupId>junit</groupId> //团体、组织的标识符。一般对应着 java 的包结构。
<artifactId>junit</artifactId>//单独项目的唯一标识符
<version>4.11</version> //版本号
<scope>test</scope> //scope周期 测试用test
</dependency>
</dependencies>
pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。
<pluginManagement> //统一管理插件
<plugins> //在里面配置所有插件
<plugin> //一个插件
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</pluginManagement>
之前提到了Servlet里出现红字,就是因为没有引入依赖,所以javax.servlet.http.HttpServletRequest需要导入两个包:javax.servlet和javax.servlet.http。在groupId中输入信息,然后IDEA会智能补齐。
配置完依赖之后,使用maven的tomcat插件,这种方式不需要本地安装的tomcat,使用插件内置的tomcat在本地启动项目。
回到Servlet,有可能IDEA已经将包引入了,如果没有的话,将鼠标放到红字上面,按下Alt+Enter导入包。
找到这个小写的m,点击打开
输入tomcat7:run,运行项目。
将生成的访问路径拿下来,放到地址栏去访问
访问结果如下,可以清楚地看到这里报错了,分析一下错误javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name “javax/servlet/http/HttpServletRequest”,简单地来说就是在加载的时候,HttpServletRequest出现了不同的版本,这个就和scpoe作用域有关。
打开一个安装好的tomcat中的lib文件夹,我们可以看到servlet-api.jar,jsp-api.jar两个jar包,这说明在引入tomcat的插件的时候,已经有了这两个jar包,而在pom.xml中我们引入了这两个依赖关系,所以自然会引起冲突。解决方法就是利用scope作用域。
scope作用域
1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
4、runtime在运行的时候依赖,在编译的时候不依赖
所以在这里加上provided依赖。
默认路径是index.jsp的欢迎界面
输入MyServlet进行跳转,成功跳转到hello.jsp,显示hello,maven。至此,一个简单的Servlet跳转demo成功运行。
Ysc第四篇文章
2020.02.03