使用普通方式创建项目的问题
前几篇文章中,我们使用普通方法在eclispe上创建了项目,并成功的运行了helloworld文件,那么普通方法创建的项目在多人协作开发项目的时候,可能会有下面问题
1、多人协作时候各成员所使用的jar包版本可能不一致,比如:张三下载的版本是3.2,而李四下载的版本是4.2 ,服务器上的版本是4.3,这样可能导致在本地运行正常,而在服务器上运行却有可能出现问题。
2、需要从网上去搜索自己所需要的依赖包,如果想要团队协作保证各个成员的jar包保持一致,需要来回的拷贝jar包。
什么是Maven
普通方式创建项目有上面所说的不足之处,还好我们有Maven可以解决上面的问题,那么什么Maven? (官网: http://maven.apache.org/index.html)
在这里我只能简单的介绍,让大家有个感性上的认识。
Maven是一个管理项目的工具,可以方便的管理项目的jar包依赖、测试、编译、打包、发布。
1、管理jar包依赖
这个功能可能是Maven最突出的特点,大家不用再去网上单独下载jar包,而是在pom.xml里配置jar包的依赖关系,具体看下面例子:
org.springframework spring-aop 3.2.4.RELEASE org.springframework spring-core 3.2.4.RELEASE
大致解释下几个配置项的意思:
groupId:所述的项目名称,由于有的项目并不是一个jar包构成的,而是由很多的jar包组成的。因此这个groupId就是整个项目的名称。
artifactId:包的名称。
version:版本号。
packaging:包的类型,一般都是jar,也可以是war之类的。如果不填,默认就是jar。
大家可以看到每个jar包配置项内都有版本号,这样团队开发时候大家只要保证pom.xml一致,那么Maven就会自动下载pom.xml配置项内的包,这样既不用自己下载,又保证了团队内各个成员下载jar包的版本都一样。
2、其他功能
Maven除了管理依赖包之外,还可以编译、测试、打包项目,具体命令如下:
mvn archetype:create 创建Maven项目mvn compile 编译源代码mvn deploy 发布项目mvn test-compile 编译测试源代码mvn test 运行应用程序中的单元测试mvn site 生成项目相关信息的网站mvn clean 清除项目目录中的生成结果mvn package 根据项目生成的jarmvn install 在本地Repository中安装jarmvn eclipse:eclipse 生成eclipse项目文件mvn jetty:run 启动jetty服务mvn tomcat:run 启动tomcat服务mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类
如果想要更加深入了解Maven请看:
Eclipse建立Maven项目
GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。
ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
Version是版本号,这个自己写了。
此处列表是,部署项目时,文件发布的路径。
我们删除test的两项,因为test是测试使用,并不需要部署。见下图:
配置文件pom.xml
4.0.0 com.mavenPro demo war 1.0 demo Maven Webapp http://maven.apache.org org.springframework spring-aop 3.2.4.RELEASE org.springframework spring-core 3.2.4.RELEASE org.springframework spring-context 3.2.4.RELEASE org.springframework spring-context-support 3.2.4.RELEASE org.springframework spring-aspects 3.2.4.RELEASE org.springframework spring-orm 3.2.4.RELEASE org.springframework spring-jdbc 3.2.4.RELEASE org.springframework spring-jms 3.2.4.RELEASE org.springframework spring-webmvc 3.2.4.RELEASE org.springframework.security spring-security-ldap 3.2.4.RELEASE org.springframework spring-test 3.2.4.RELEASE provided com.googlecode.ehcache-spring-annotations ehcache-spring-annotations 1.2.0 org.springframework.data spring-data-mongodb 1.5.4.RELEASE org.springframework.data spring-data-redis 1.2.0.RELEASE javax.servlet javax.servlet-api 3.0.1 junit junit 3.8.1 test mavenDemo
文件里有一些注释,初学者先大致了解,今后会详细介绍。
配置文件web.xml
demo contextConfigLocation classpath:demo-root-servlet.xml log4jExposeWebAppRoot false characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true characterEncodingFilter /* gameLiveServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:demo-servlet.xml 1 gameLiveServlet / org.springframework.web.util.Log4jConfigListener org.springframework.web.context.ContextLoaderListener
注释写的有点多,大家要仔细看,这里重点说下我踩过的坑:
这里我曾经遇到一个坑,这里说出来告诉大家。大家先看内有个 里面也有一个 contextConfigLocation 配置于是我自作聪明把最外层的删除,只保留 内的配置, 结果运行时候报错说找不到classpath:demo-servlet.xml文件,此时系统会自动去找/WEB-INI/applicationContext.xml文件, 此时文件是不存在的所以也报错。切记:如果要用classpath方式去定位配置文件,文件路径在最外层的配置一定要有,仅仅只写servlet内的配置是无法找到的。如果最外层不想写只在servlet标签内定位spring配置文件,只能用/WEB-INI/文件名.xml这样的方式。
Spring容器加载web.xml的顺序为context-param >> listener >> fileter >> servlet
Spring配置文件
在上面的web.xml配置文件中我们有两个Spring的配置文件,分别是/src/man/resources/demo-root-serlvet.xml 和/src/man/resources/demo-servlet.xml
用classpath方式定位文件必须要放到/src/man/resources/下否则要放到/src/main/webapp/WEB-INF/ 路径下。
/src/man/resources/demo-root-servlet.xml 文件的主要用途为包含其他子配置文件,例如数据库配置文件、AOP配置文件。
/src/man/resources/demo-servlet.xml 文件主要是声明一些本项目用到的bean。
/src/man/resources/demo-root-servlet.xml 内容:
Spring公共配置
由于本次不涉及数据库内容,所以我将引入数据配置文件内容注释了。
/src/man/resources/demo-servlet.xml内容:
demo
Hello world
接下来我们就要写hello world 了,先在/src/main/java里建立一个包,再包内建立一个文件HelloWorld
HelloWorld.java内容如下:
package com.demo.game;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class HelloWorld { @RequestMapping("/hello") public void index(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setHeader("content-type", "text/html;charset=UTF-8"); response.getWriter().append("hello World"); }}
大家看到没有demo-servlet.xml配置文件里有一句:
将HelloWorld注册为一个bean , 这样就让他由一个普通类变成控制器了,接下来我们启动tomcat server ,再浏览器里输入http://localhost:8080/demo/hello
忙活了半天,hello world终于出来了,终于有点小小成就感!!!