m2e创建webapp工程

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目录的问题了。


你可能感兴趣的:(webapp)