(一)环境搭建
Maven是可以用于任何基于Java的项目建设和管理的工具,使得Java开发人员的日常工作变得更加容易和简捷。
1、安装JDK
1)下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/index.html
2)安装好,配置JDK环境变量。右键 我的电脑 --->属性--->高级--->环境变量。
2.1)新建一个系统变量,变量名为 JAVA_HOME ,值为JDK的安装目录。
2.2)找到名为Path的变量,然后编辑,在其变量值后添加 %JAVA_HOME%\bin,注意和前面的值用分号;隔开。
2.3)在命令行下执行:java -version,显示下面内容,说明环境变量配置成功。
2、安装Maven
1)下载Maven:http://maven.apache.org/download.html
2)将下载的发布包解压。
3)配置Maven的环境变量。
3.1)新建系统变量,变量名为:M2_HOME,变量值为Maven的解压路径。
3.2)找到Path变量,在其值后追加%M2_HOME%\bin,注意和前面的值用分号;隔开。
3.3)在命令行下执行:mvn -v,看到类似下面的内容,配置成功。
4、Maven的目录介绍
1)bin : 存放mvn运行的脚本。
2)boot :只有一个jar文件,是Maven使用的类加载器框架。
3)conf :只有settings.xml文件,修改该文件,可以全局的配置Maven的行为属性。
4)lib :Maven运行时所需类库。
5、转移仓库目录
在系统盘的用户目录下,会有一个名为:.m2 的文件夹,在.m2文件夹下,有一个叫repository的文件夹。
我这里是:C:\Documents and Settings\Administrator\.m2\repository
repository文件夹是用来存放下载的jar的,项目中用到的jar包会先到这个目录下找,找不到就从网络上下载到这个目录。随着时间的推移项目的增多,这个目录里面的jar文件会越来越多,如果系统盘空间吃紧,可以把repository文件夹移动其他分区盘。我这里把repository目录移动到:D:\Maven\repository,然后把Maven解压目录下的conf文件夹里面的setting.xml复制.m2目录中,这样就可以在用户范围上配置Maven的行为属性。
刚才我们移动了repository目录,所以我们需要配置setting.xml。
打开.m2目录下的setting.xml,找到 localRepository,然后改成如下:
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ~/.m2/repository --> <localRepository>D:\Maven\repository\</localRepository> <!--repository移动后的路径-->
6、配置代理
如果所在的办公环境是通过代理服务器连接外网,则需要给Maven配置代理,否则连不了Maven的中央仓库。
打开.m2目录下的setting.xml,找到proxies,在<proxies></proxies>节点里面可以进行代理的配置。
<proxies> <!-- proxy | Specification for one proxy, to be used in connecting to the network. | <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>proxyuser</username> <password>proxypass</password> <host>proxy.host.net</host> <port>80</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> --> <proxy> <id>maven-proxy</id> <!--代理的唯一标识--> <active>true</active> <!--是否激活代理--> <protocol>http</protocol> <!--代理使用的协议--> <username>proxyuser</username> <!--用户名--> <password>proxypass</password> <!--密码--> <host>proxy.host.net</host> <!--代理服务器--> <port>80</port> <!--端口--> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> <!--不需要代理的域名--> </proxy> </proxies>
(二) 常用命令和标准的Maven项目结构
1、常用命令
1)创建一个Project
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate 固定格式
-DgroupId 组织标识(包名)
-DartifactId 项目名称
-DarchetypeArtifactId 指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project
-DinteractiveMode 是否使用交互模式
2)编译源代码
mvn compile
3)编译测试代码
mvn test-compile
4)清空
mvn clean
5)运行测试
mvn test
6)生产站点目录并打包
mvn site-deploy
7)安装当前工程的输出文件到本地仓库
mvn install
8)打包
mvn package
9)先清除再打包
mvn clean package
10)打成jar包
mvn jar:jar
11)生成eclipse项目
mvn eclipse:eclipse
12)查看帮助信息
mvn help:help
13)查看maven有哪些项目类型分类
mvn archetype:generate -DarchetypeCatalog=intrenal
2、标准的Maven项目结构
src/main/java 存放项目的源代码
src/test/java 存放测试源代码
如果要存放一些配置文件,可以再建立一个目录src/main/resource存放,如存放log4j.properties等
使用Maven构建一个简单的Java项目
1、进入命令行,执行下面的语句。
mvn archetype:generate -DgroupId=cn.luxh.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
执行完成后,可以看到如下结果:
BUILD SUCCESS,当在前用户目录下(即C:\Documents and Settings\Administrator)下构建了一个Java Project叫做my-app。
2、进入my-app目录,可以看到有一个pom.xml文件,这个文件是Maven的核心。
1)pom意思就是project object model。
2)pom.xml包含了项目构建的信息,包括项目的信息、项目的依赖等。
3)pom.xml文件是可以继承的,大型项目中,子模块的pom.xml一般都会继承于父模块的pom.xml
4)刚构建的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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.luxh.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
节点元素说明:
<project> pom文件的顶级节点 <modelVersion> object model版本,对Maven2和Maven3来说,只能是4.0.0 <groupId> 项目创建组织的标识符,一般是域名的倒写 <artifactId> 定义了项目在所属组织的标识符下的唯一标识,一个组织下可以有多个项目 <packaging> 打包的方式,有jar、war、ear等 <version> 当前项目的版本,SNAPSHOT,表示是快照版本,在开发中 <name> 项目的名称 <url> 项目的地址 <dependencies> 构建项目依赖的jar <description> 项目的描述
其中由groupId、artifactId和version唯一的确定了一个项目坐标
3、构建的my-app项目结构如下
1)编译源程序,进入命令行,切换到my-app目录,执行命令:mvn clean compile
编译成功,在my-app目录下多出一个target目录,target\classes里面存放的就是编译后的class文件。
2)测试,进入命令行,切换到my-app目录,执行命令:mvc clean test
测试成功,在my-app\target目录下会有一个test-classes目录,存放的就是测试代码的class文件。
3)打包,进入命令行,切换到my-app目录,执行命令:mvc clean package,执行打包命令前,会先执行编译和测试命令
构建成功后,会再target目录下生成my-app-1.0-SNAPSHOT.jar包。
4)安装,进入命令行,切换到my-app目录,执行命令:mvc clean install ,执行安装命令前,会先执行编译、测试、打包命令
构建成功,就会将项目的jar包安装到本地仓库。
5)运行jar包,进入命令行,切换到my-app目录,执行命令:java -cp target\my-app-1.0-SNAPSHOT.jar cn.luxh.app.App
1、进入命令行,执行:
mvn archetype:generate -DgroupId=cn.luxh.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false
出现一些版本号确认等直接回车就行,构建成功出现下面的提示。
在当前用户目录下,生成的web项目目录结构如下:
2、当然这个空的项目,只有一个index.jsp页面,打包发布运行。
1)在命令行切换到my-web-app目录,执行:mvn package,构建成功后,my-web-app目录下多了一个target目录,在这个目录下会打包成my-web-app.war,把这个war包拷贝到Tomcat的发布目录下就可以运行了。
2)集成Jetty发布运行,需要配置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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.luxh.app</groupId> <artifactId>my-web-app</artifactId> <packaging>war</packaging><!--web项目默认打包方式 war--> <version>1.0-SNAPSHOT</version> <name>my-web-app Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>my-web-app</finalName> <pluginManagement> <!--配置Jetty--> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> </plugin> </plugins> </pluginManagement> </build> </project>
然后执行:mvn jetty:run 就可以在8080端口上访问应用了。
这里用的Eclipse版本是4.2 JUNO,打开Eclipse,菜单:Help--->Install New Software...打开安装软件窗口,在Work with...输入框点击Add...在弹出的窗口name处输入:m2eclipse ,Location处输入:http://m2eclipse.sonatype.org/sites/m2e 。
然后一步一步往下操作就ok了,安装完成,会提示重启Eclipse,重启即可。(如果是通过代理访问外网,需要先设置Eclipse的代理)
重启Eclipse后,指定Maven为自己安装的Maven。
1、创建一个Java项目
1)File--->New--->Other--->Maven--->Maven Projet
2)选择maven-archetype-quickstart
3)输入项目的信息
4)生成的Java项目包结构如下
5)修改pom.xml,指定编译时的JDK版本
<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.luxh.app</groupId> <artifactId>my-app</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>my-app</name> <url>http://maven.apache.org</url> <!-- 指定属性 --> <properties> <junit.version>4.10</junit.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.6</jdk.version> </properties> <build> <plugins> <!-- 指定JDK的编译版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </project>
2、创建一个Web项目
1)File--->New--->Other--->Maven--->Maven Projet
2)选择maven-archetype-webapp
3)填写项目信息
4)生产的Web项目包结构
4.1)把项目转为 Dynamic Web Module,在项目上点击右键,选择属性,然后选择Project facets,然后点击Convert to faceted form...
勾选Dynamic Web Module,选择3.0,表示支持servlet3.0
勾选Java,选择1.6或更高的jdk版本
4.2)工具只生成了一个叫 src/main/resource的source folder,我们需要手工添加 src/main/java、src/test/java和src/test/resource 三个source folder,在项目上右键 New ---->Source Folder,输入folder name即可。
4.3)修改Source Folder的编译路径,进入Java Build Bath窗口,双击每个文件夹下的Output folder,指定路径。
src/main/java和src/main/resource指定target/calsses,src/test/java和src/test/resource指定target/test-classes
都选上选上Allow output folders for source folders.
4.4)配置部署的程序Deployment Assembly,删掉test的那两项,test的程序发布的时候不需要,添加maven的依赖库,发布的时候可以发布到lib目录中,添加/src/main/webapp为部署的根目录
5)配置tomcat7,发布运行项目
(六)使用Eclipse开发一个Servlet3.0的简单例子
1、打开Eclipse4.2,新建一个Maven项目
1)选择maven的archetype为maven-archetype-webapp
2)填写项目信息
2、完善项目目录结构
1)手工添加 src/main/java、src/test/java和src/test/resource 三个source folder,在项目上右键 New ---->Source Folder,输入folder name即可。
2)修改Source Folder的编译路径,进入Java Build Bath窗口,双击每个文件夹下的Output folder,指定路径。
src/main/java和src/main/resource指定target/calsses,
src/test/java和src/test/resource指定target/test-classes
都选上选上Allow output folders for source folders.
3、把项目转为 Dynamic Web Module
1)在项目上点击右键,选择属性,然后选择Project facets,然后点击Convert to faceted form...
勾选Dynamic Web Module,选择3.0,表示支持servlet3.0
勾选Java,选择1.6或更高的jdk版本
然后再点击Further configuration available...,在弹出的窗口中Context directory输入:src/main/webapp
2)配置部署的程序Deployment Assembly,删掉test的那两项,test的程序发布的时候不需要,添加maven的依赖库,Eclipse发布的时候可以发布到lib目录中
3)删除jdk5,添加jdk6
4、pom.xml文件配置,添加Servlet3依赖、日志配置等
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.luxh.app</groupId> <artifactId>app</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>app Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 属性配置 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.10</junit.version> <logback.version>1.0.7</logback.version> <slf4j.version>1.7.2</slf4j.version> </properties> <!-- 依赖配置 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1-b02</version> <type>jar</type> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> </dependencies> <build> <finalName>demo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
5、logback.xml日志文件配置,该文件存放在src/main/resources/目录下
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台输出 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="stdout"/> </root> </configuration>
6、编写Servlet
1)写个编码过滤器
package cn.luxh.app.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Servlet Filter implementation class EncodingFilter */ @WebFilter("/EncodingFilter") public class EncodingFilter implements Filter { final static Logger LOG = LoggerFactory.getLogger(EncodingFilter.class); public void destroy() { LOG.info("销毁......"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { LOG.info("初始化......"); } }
2)第一个Servlet
package cn.luxh.app.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Servlet implementation class FirstServlet */ @WebServlet("/FirstServlet") public class FirstServlet extends HttpServlet { final static Logger LOG = LoggerFactory.getLogger(FirstServlet.class); private static final long serialVersionUID = 6833688147345340845L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { LOG.info("hello"); PrintWriter out = response.getWriter(); out.print("first servlet"); out.flush(); out.close(); } }
3)web.xml不需要任何配置,用tomcat7发布,tomcat6不支持Servlet3。访问:http://localhost:8080/app/FirstServlet