1:安装m2e的方法网上一大堆,就不说了,现在可以在eclipse的市场中搜索maven,也可以在
installations new software中安装普通eclipse插件安装方式进行安装,地址为:m2e releases repository - http://download.eclipse.org/technology/m2e/releases
2:然后进行maven相关的配置,最好用自己本地安装的maven,不要用eclipse自带的。
3:新建maven工程,在Select an Archetype时,选择maven-archetype-webapp,然后就填入一些相关坐标点下一步就OK了。
4:如果在第三步中出现错误,比如类似:
Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp:RELEASE from any of the configured repositories.
Could not resolve artifact org.apache.maven.archetypes:maven-archetype-webapp:pom:RELEASE
Failed to resolve version for org.apache.maven.archetypes:maven-archetype-webapp:pom:RELEASE: Could not find metadata org.apache.maven.archetypes:maven-archetype-webapp/maven-metadata.xml in local (C:\Users\scmroad\.m2\repository)
Failed to resolve version for org.apache.maven.archetypes:maven-archetype-webapp:pom:RELEASE: Could not find metadata org.apache.maven.archetypes:maven-archetype-webapp/maven-metadata.xml in local (C:\Users\scmroad\.m2\repository)
等信息,那就检查一下网络,比如代理是否好用等,最新的eclipse juno已经会自动查找本机IE的代理设置,不用自己再手动设置了,而且最新的m2e插件在连接远程仓库时也会直接先走eclipse的newwork中的代理设置,即使自己本地的settings.xml中没有设置proxy。
最好能找一个不用代理环境的外网,会很少出问题,随便提一下,本机的maven如果跑命令行模式,和eclipse无关,这时如果有网络代理,必须要设置settings.xml文件中的proxy了,而且好像其中的username和password不支持@和,等特殊符号。
5:完成工程的建立以后会发现目录结构如下:
举例工程信息如下:
mvn archetype:create
-DgroupId=com.burlesontech.sw
-DartifactId=webapp
-DarchetypeArtifactId=maven-archetype-webapp
则:
You project will now have the following structure:
sw
webapp
src
main
resources
webapp
WEB-INF
web.xml
index.jsp
pom.xml
.project
你会奇怪这结构不符合web目录习惯啊,明显没有WEB-INF/lib目录,其实JAVAEE规范要求的WEB应用目录如下:
按照 Java EE 规范的规定,一个典型的Web 应用程序有四个部分:
1. 公开目录
2. WEB-INF/web.xml 文件,发布描述符(必选)
3. WEB-INF/classes 目录,编译后的Java 类文件(可选)
4. WEB-INF/lib 目录,Java 类库文件(*.jar)(可选)
注意后两项是“可选”的,人家没要求一定要有lib,甚至classes目录,这些在容器或应用启动的时候指定classpath就行了,只是好多web容器默认自动加载了这两个目录为classpath中的一部分了。
所以人家maven不建立lib目录也没什么问题,但还是不习惯,别着急。
先按照正常的maven的目录把现在还缺少的目录建立完整,如下:
src/main/java
src/main/resources
src/test/java
src/test/resources
在src/main/java目录中随便建立一个servlet
如下:
package org.coffeesweet.foo.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello extends HttpServlet {
private static final long serialVersionUID = -3696470690560528247L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h1> HELLO WORD!");
out.print("</body></html>");
}
}
web.xml中别忘了添加servlet映射(MAVEN默认建立的web.xml是2.3的,这里改成2.5了,注意3.0的需要JAVA7支持,不需要在web.xml理配置servlet映射,直接在servlet类上写注解就行了):
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_5.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>org.coffeesweet.foo.web.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>
pom.xml添加依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
默认scope是compile,即:对于编译,测试,运行三种classpath都有效,理论上servlet-api在web/lib中可以没有,因为一般web容器都会自带,只需要在写代码时编译用一下,scope定义为:provided就行了,
这里为了做示例故意这么定义一下,感兴趣的可以改一下范围这个再试试。
这时执行maven clean package后发现在target的WEB-INF下自动新建了lib目录,并且将servlet-2.5.jar添加到该目录下了,打出来的war包里也有WEB-INF/lib目录了。
但在src下的webapp下面的WEB-INF里还是没有lib目录,也不影响了,只要打出来的包里有,web容器就会认了,所以MAVEN还是很智能的,在不需要的时候绝不多建,需要的时候自动建。
这时按照上面的提示将依赖修改成如下:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
即:修改了依赖范围成provided时,再执行mvn clean package后,target和war中的WEB-INF下面的lib又没有了。
从而证明,MAVEN的war插件还是很智能的,你不需要往容器添加额外jar的时候,它连lib目录都懒得生成了,你需要的时候,它会给你自动生成,不知道这个和plug的版本是否有关,留给大家实验吧,反正我得到
的结果是不需要像网上大家讲的那样还要利用eclipse自己的web工程功能来修改工程属性什么的,MAVEN自己就能搞定类的依赖和lib目录的问题了。