1.目標
該篇主要是為了快速利用maven來構建工程,maven作為項目管理的工具已經得到極大程度的應用,很多開源項目都用maven來構建。如何建立
一個maven工程,如何導入別人的maven工程,是這篇文章的核心。
2. 創建maven工程
2.1 下載maven的開發包
maven為apache下opensource項目,其下載地址為: http://maven.apache.org/ , 下載后將jar包解壓到任意目錄(建議不要有空格和中文目錄)
配置M2_HOME ,以及path路徑 :
配置完成以后在命令行執行 mvn -v 獲得maven的安裝版本,表示安裝成功 !
2.2 eclipse下開發maven項目
可以到網上下載m2eclipse插件,但是在eclipse最新版本 luna 中已經集成了maven插件,在eclipse中配置maven ,如圖:
其中的settings.xml文件為maven的核心配置文件 。以上也指定了maven的本地倉庫 。
新建一個maven工程 (web工程)
選擇Maven Project 后Next
選擇webapp
工程建立完畢,如下
一開始工程有一個紅叉,暫時不管它。先說一個maven的目錄結構 最基本的結構如下(一個普通的java工程):
|-src
|-main
|-java
|-test
|-java
|-target
|-pom.xml
其作用:
|-src |-main |-java -->平常工程中的java代碼 |-test |-java -->放置測試的java代碼,以Test開頭或者結尾的java代碼在maven工程會自動運行 |-target -->maven工程編譯過后生成的文件 |-pom.xml -->maven工程依賴的jar對應的配置文件(核心文件) |
上面的建立的工程目錄不滿足我們的需求,需要手動建立。將工程切換到java EE視圖下
鼠標右擊以后建議一個java文件夾,然后添加到Source Folder
同樣的道理在src先建立test文件夾,然后在test文件夾下建立java文件夾,得到
2.3 案例 WebDemo
在一篇中利用到了案例WebDemo ,其結構如下:
其中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>org.lkl.demo</groupId> <artifactId>WebDemo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>WebDemo Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1-b09</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.atteo.moonshine</groupId> <artifactId>h2</artifactId> <version>0.9</version> </dependency> </dependencies> <build> <finalName>WebDemo</finalName> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>7.0.2.v20100331</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webAppConfig> <contextPath>/</contextPath> </webAppConfig> <webAppSourceDirectory>webapp</webAppSourceDirectory> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>8080</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin> </plugins> </build> </project>
dependencies 下配置工程依賴的jar的信息,可以在http://mvnrepository.com/ 中查到需要的依賴文件
例如 :
下面依次來解釋pom.xml中的內容
<groupId>org.lkl.demo</groupId> <artifactId>WebDemo</artifactId> -->工程表示 <packaging>war</packaging> -->編譯打包的形式 <version>0.0.1-SNAPSHOT</version> -->里程碑信息 <name>WebDemo Maven Webapp</name> <url>http://maven.apache.org</url>
注意一下這里的里程碑信息,一般情況下有如下幾種形式的里程碑
SNAPSHOT:快照 在開發中的版本 ALPHA:內部測試的版本 BETA:公測的版本(給外部人員使用的版本) RELEASE: 又稱RC 釋放版本 GA:穩定的版本
依賴信息
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version> -->版本
<scope>test</scope> -->對應的jar包在工程中的依賴范圍
</dependency>
其依賴范圍有如下幾種
1. test范圍指的是測試范圍有效,在編譯和打包時都不會使用這個依賴 2. compile范圍指的是在編譯范圍有效,在編譯和打包的時候都會將依賴存儲進去 3. provided范圍,在編譯和測試范圍有效,在打包時不會加入依賴,如servlet-api.jar,一般在服務器中已經存在了, 如果還打包進去的話就會造成沖突 4. runtime在運行的時候依賴,在編譯的時候不依賴
看下面的servlet的配置:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1-b09</version>
<scope>provided</scope>
</dependency>
其依賴范圍為provided,在打包的時候就不會進行依賴,因為一般的app server中都存在對應的jar,剛才建立的工程中出現紅叉就是因為沒有添加該依賴信息。
最后一個依賴
<dependency>
<groupId>org.atteo.moonshine</groupId>
<artifactId>h2</artifactId>
<version>0.9</version>
</dependency>
為H2內存數據庫的依賴,不需要安裝 http://www.h2database.com/html/quickstart.html ,在test/java文件夾中存在一個H2DBTest.java的文件,就是用來測試該數據庫的。其內容如下
package org.lkl.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; public class H2DBTest { @Test public void testDemo() throws Exception{ System.out.println("--test h2 db --"); Class.forName("org.h2.Driver") ; Connection conn = DriverManager.getConnection("jdbc:h2:test", "sa", "") ; System.out.println(conn); PreparedStatement pstmt = conn.prepareStatement("drop table if exists person; create table person(id int primary key ,name varchar)") ; pstmt.execute() ; for(int i = 1 ;i<11 ;i++){ pstmt = conn.prepareStatement("insert into person(id,name) values (?,?)") ; pstmt.setInt(1, i); pstmt.setString(2, "zhangsan-"+i); pstmt.execute() ; } pstmt = conn.prepareStatement("select id,name from person") ; ResultSet rs = pstmt.executeQuery() ; while(rs.next()){ System.out.println("id="+rs.getInt(1)+";name="+rs.getString(2)); } conn.close(); } }
前面已經說過test/java文件夾下的以Test開頭或結尾的java文件中的測試方法會在maven工程執行的時候自動運行 ,選中pom.xml文件鼠標右擊-->Run As -->Maven test
得到結果
也可以使用 Maven Build 然后輸入test來執行(該方法用來手動輸入命令) ,其操作和 Maven test 一致
輸入test后執行
測試說完以后接下來繼續說pom.xml后面的文件 plugins 表示的為maven工程的插件
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>7.0.2.v20100331</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webAppConfig> <contextPath>/</contextPath> -- >工程訪問路徑 </webAppConfig> <webAppSourceDirectory>webapp</webAppSourceDirectory> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>8080</port> -->端口 <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin>
該插件為jetty服務器插件,不推薦使用tomcat .運行為 Maven build 然后輸入 jetty:run
輸入 localhost:8080 得到如下頁面:
一個maven工程就這樣子運行起來了
附上工程中其他代碼
index.html (靜態文件哦)
<html> <body> <hr style="margin-top: 100px;"> Welcome to <a href="HelloWorld" style="cursor: pointer;color: red">Apache+Tomcat</a> </body> </html>
然后是 main/java下的servlet
package org.lkl.demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloWorld */ public class HelloWorld extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { System.out.println("---getDbData():"+getDbData()); request.setAttribute("resultSize",getDbData() ); request.getRequestDispatcher("welcome.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } private int getDbData() throws Exception{ System.out.println("--test h2 db --"); Class.forName("org.h2.Driver") ; Connection conn = DriverManager.getConnection("jdbc:h2:test", "sa", "") ; System.out.println(conn); PreparedStatement pstmt = conn.prepareStatement("drop table if exists person; create table person(id int primary key ,name varchar)") ; pstmt.execute() ; List<String> nameList = new ArrayList<String>() ; for(int i = 1 ;i<11 ;i++){ pstmt = conn.prepareStatement("insert into person(id,name) values (?,?)") ; pstmt.setInt(1, i); pstmt.setString(2, "zhangsan-"+i); pstmt.execute() ; } pstmt = conn.prepareStatement("select id,name from person") ; ResultSet rs = pstmt.executeQuery() ; while(rs.next()){ System.out.println("id="+rs.getInt(1)+";name="+rs.getString(2)); nameList.add(rs.getString(2)) ; } conn.close(); return nameList.size(); } }
welcome.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!-- 解決el表示是不啟作用 --> <%@ page isELIgnored="false"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>welcome</title> </head> <body> <hr style="margin-top: 100px;"> You obtain <font color="red">${resultSize}</font> datas. </body> </html>
該篇結束.下篇繼續討論 apache + tomcat