• 第二篇、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

  • 相关阅读:
    chrome安装vue-devtools
    企业网络设计
    nginx的安装
    Typora 的使用
    如何学习dubbo?
    关于原码反码和补码以及byte&0xff
    HttpClient以及连接池的使用
    计算机网络读书笔记:tcp面试常见问题都在里面了
    接口类是否继承自Object?
    数据挖掘会议记录
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3967225.html
Copyright © 2020-2023  润新知