第二篇、Maven快速上手


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM