【Maven从入门到实战教程】第二章 手动搭建Maven工程

一、Maven约定

Java项目与JavaWeb项目中src即源码目录。

    Maven项目的源码目录有四个,分别为:
        src/main/java:存放项目的源码(.java)文件。
        src/main/resources:存放项目配置资源文件和资源文件,如Spring、Mybatis配置文件,db.properties数据库资源文件。
        src/test/java:存放测试代码,如Junit测试类。
        src/test/resources:存放测试中使用的配置文件。

src/main/webapp:Maven Web项目的目录,类似eclipse中Web项目的WebContent/WebRoot目录。

target:项目输出位置,编译后的class文件会输出到此目录。

pom.xml:当前项目的配置管理、依赖管理、插件管理。

结构如下:

Project
    |---src
    |----|---main
    |----|----|---java            存放项目的.java文件
    |----|----|---resources        存放项目资源文件,如spring, hibernate配置文件
    |----|----|---webapp        webapp目录是web工程的主目录
    |----|----|---|---WEB-INF
    |----|----|---|---web.xml
    |----|---test
    |----|----|---java            存放所有测试.java文件,如JUnit测试类
    |----|----|---resources        测试资源文件
    |---target                    目标文件输出位置例如.class、.jar、.war文件
    |---pom.xml                    maven项目核心配置文件

二、手动搭建Maven工程实现

2.1 手动搭建Maven Java项目

    我们必须知道:Maven本身是一个平台无关的开源工程,也就是说:Maven可以为创建在任何开发平台上的Maven项目提供jar文件支持,也就是说:即使脱离了Eclispe、IDEA这样的开发平台,Maven也是可以直接运行,为项目提供jar文件支持的。

    那么下面我们手动创建并编译、运行一个独立的Maven项目,并经由这个项目,补充一些关于Maven本身的其他知识点。

2.1.1 创建Maven项目的文件夹目录

首先我们来看一个目录结构:

MavenProjectName:
    |---src
    |----|---main
    |----|----|---java
    |----|----|---resources
    |----|---test
    |----|----|---java
    |----|----|---resources
    |---pom.xml

    那么我们首先按照这个最简结构,在自己的磁盘上手动创建一个用于保存Maven项目Java文件和测试文件的文件夹结构,并且在这个文件夹中编写代码、添加POM文件,并逐步将这个项目进行编译和运行。

2.1.2 配置Maven工程的pom.xml文件

    Maven工程的 pom.xml 文件是Maven工程的灵魂,一个Maven项目下所有重要的信息和对jar文件的支持都是通过这个文件进行配置的,下面我们来手动配置这个pom.xml文件(注意编码格式)。

1、在项目的根文件夹下创建pom.xml配置文件,并创建如下基本结构:

<?xml version="1.0" encoding="UTF-8"?>

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

</project>

上述配置属于Maven项目中pom.xml文件的基本配置方式,其中:

    <modelVersion></modelVersion>标签:标示的是当前Maven项目使用的描述规范版本号。这个标签大家不必纠结,目前比较主流的Maven项目使用的描述规范版本号是4.0.0版本。

2、配置pom.xml文件中的项目坐标:

    每一个Maven项目必须在pom.xml文件中配置如下内容,因为Maven就是根据这些配置信息来确定一个项目的具体位置的,所以下面我们将要配置的信息,也称之为一个项目的项目坐标。

    如何理解项目坐标:在实际生活中,坐标的概念就很普及:同样是在杨国福麻辣烫订的餐,为什么外码小哥能够准确的将你的那一份送到你的手中,而不是别人的手中呢?就是使用坐标。现实生活中我们使用省、市、区、街道、小区、栋、单元、楼层、门牌号等信息标识我们自己的坐标,所以外卖小哥能够按照这个“坐标”将外卖正确的送到你的手中。

    同样的,在我们一台计算机当中,可能同时存在多个Java项目,那么Maven是如何对这些项目进行区分的呢?同样是使用项目坐标,所以说:项目坐标是Maven软件用来识别一个Java项目的唯一标识。

    就像我吃麻辣烫一定要加墨鱼丸,并且从来不吃香菜一样,Maven软件也是根据项目坐标来区分这个项目需要哪些jar文件,不需要哪些jar文件的。

    OK!现在应该已经能够理解项目坐标的含义了吧?那么下面我们来介绍一下如何配置一个Maven项目的项目坐标:首先说明下:项目坐标直接配置在pom.xml文件的<project></project>标签之下。

描述一个项目坐标的标准结构如下:

<project>
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
    <packaging></packaging>
    <classifier></classifier>
</project>

这些标签的配置信息含义如下:

    <groupId>标签:项目组织唯一的标识符。一般为公司名称或组织名称或大项目名称,通常采用域名倒置的取名方式,影响安装到仓库的首层目录结构。
        比如:
            servlet相关jar,它的groupId就是javax.servlet,javax.servlet就是大项目名称(父项目名称)。
            mybatis相关jar,它的groupId就是org.mybatis,org.mybatis就是公司名称或组织名称。
    
    <artifactId>标签:项目的唯一的标识符。一般为项目名称或子项目名称或模块名称,影响安装到仓库的次层目录结构以及打包的名称。对于<artifactId>标签中的取值,我们建议使用当前项目(模块)的真实名称。
    
    groupId和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。

    <version>标签:表示当前项目的版本号,影响安装到仓库的末层目录结构以及打包的名称。

    <packaging>标签:表示当前项目的打包方式,除了常见取值"jar"之外,还可以取值"war",表示将当前工程打包为一个war文件
        可选jar:表示打包时以.jar文件打包。
        可选war:表示打包时以.war文件打包。
        可选pom:表示当前项目为管理类项目。
        默认为jar。
    
    <classifier>标签:用来表示当前项目在打包生成的时候产生的一些附件文件。
        More:https://www.cnblogs.com/love-kimi/archive/2012/10/09/2716507.html
    
    怎么样,上面的标签很多吧?但是在真正创建一个Maven项目的时候,根本用不上这么多坐标,Maven项目必须的坐标标签只有前3个!
    
    下面我们来看一下如何配置我们当前这个项目的坐标:将如下标签内容拷贝到之前创建的pom.xml文件的<project></project>标签之下。

<groupId>com.maven</groupId>
<artifactId>MavenTest</artifactId>
<version>0.0.1-SNAPSHOT</version>

在将上述配置拷贝的pom.xml文件之下后,我们得到这样一个pom.xml文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 当前Maven项目使用的描述规范版本号 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 配置当前Maven项目的项目坐标 -->
    <!-- 项目组织唯一的标识符 -->
    <groupId>com.maven</groupId>
    <!-- 项目的唯一的标识符 -->
    <artifactId>MavenTest</artifactId>
    <!-- 项目的版本号 -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- 当前项目的打包方式 -->
    <packaging>jar</packaging>

</project>

    到此为止,我们关于项目坐标的配置就完成了。

关于项目版本号的说明:

    Maven项目的<version>标签中使用的版本号,除了0.0.1这个数字版本号之外,还有一个版本类型:SNAPSHOT这个单词的意思是快照版本。那么项目的版本类型都分为哪几种呢?
    1、snapshot:快照版本,也就是开发版本,这个版本的项目是不能够使用的,因为正在处于开发阶段,功能不全,错误也很多,Eclispe和IDEA在创建Maven项目的时候默认会使用这个版本。
    2、alpha:内部测试版,此版本的程序也不推荐使用,这个版本的程序用在开发人员内部进行测试,寻找并更改bug。
    3、beta:外部测试版,面向用户群体发布的测试版本,虽然能够使用,但是仍然不稳定,存在较多bug,不推荐使用。
    4、release:发行版,表示官方推荐使用的版本,功能较为全面,并且运行稳定,但是会存在一些bug,可以正常使用。
    5、stable:稳定版,在发行版的基础上去除绝大部分bug,优化一些功能,建议使用。
    6、current:最新版本,不一定是稳定版本,但是具有最新的功能,如果有对应的发行版或者稳定版,建议使用前两者。
    7、eval:评估版本,具有一个月或者固定的使用期限。
    此外,还有pre、RC、GA等版本,在此不进行详细描述。

3、在pom.xml文件中添加jar文件依赖:

    我们学习Maven的目的就是为了让Maven为我们的项目自动添加和管理所需的jar文件。

    <dependencies>标签中配置当前Maven项目中所有的依赖,每个依赖都以<dependency>标签包裹,其中是依赖jar的坐标。

    并且在之前我们已经介绍过如何向pom.xml文件中添加项目所需jar文件的依赖配置,在这里我们不再进行赘述。

    为了方便当前项目的测试,我们在pom.xml文件中添加junit-4.12版本的jar文件依赖:

<!--
    所有jar文件依赖的声明都放在<dependencies>标签下的子标签<dependency>当中
    每一个依赖单独创建一个<dependency>子标签
-->
<dependencies>
    <!-- 对junit-4.12版本的jar文件依赖声明 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

将上述配置内容加入pom.xml文件之后,我们得到了一个比较全面的pom.xml文件版本:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- 当前Maven项目使用的描述规范版本号 -->
    <modelVersion>4.0.0</modelVersion>
	
	<!-- 配置当前Maven项目的项目坐标 -->
	<!-- 项目组织唯一的标识符 -->
	<groupId>com.maven</groupId>
	<!-- 项目的唯一的标识符 -->
    <artifactId>MavenTest</artifactId>
	<!-- 项目的版本号 -->
    <version>0.0.1-SNAPSHOT</version>
	<!-- 当前项目的打包方式 -->
    <packaging>jar</packaging>
	
	<!--
    所有jar文件依赖的声明都放在<dependencies>标签下的子标签<dependency>当中
    每一个依赖单独创建一个<dependency>子标签
	-->
	<dependencies>
		<!-- 对junit-4.12版本的jar文件依赖声明 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

    到此为止,整个Maven工程的pom.xml配置文件就已经搞定了,下面让我们来写一些Java代码。

2.1.3 在Maven工程中编写Java代码

    Maven工程是严格区分Java源代码和测试代码的,这些代码会被分别存放在不同位置下,并且在之后的编译和运行过程中我们也会看到,Maven对Java源代码和测试代码的编译和运行也是截然不同的。

1、编写Java源代码:

    Maven项目下所有的Java源代码都是统一存放在src/main/java这个文件夹下的,那么我们在这个文件夹下创建如下Java源文件和代码:

HelloMaven.java:

package com.maven;

public class HelloMaven {
	
	private String msg = "Hello Maven!";
	
	public void sayHi() {
		System.out.println(msg);
	}	
	
}

2、编写测试代码:

    Maven项目下的所有测试代码存放在src/test/java这个文件夹下,那么我们在这个文件夹下创建如下的测试类和测试代码:

HelloMavenTest.java:

package com.maven;

import org.junit.Test;

public class HelloMavenTest {
	
	@Test
	public void test1() {
		HelloMaven hm = new HelloMaven();
		hm.sayHi();
	}	

}

    到此为止,我们Maven工程中的Java代码就已经写好了,在上述步骤中,我们需要重点掌握的是:Maven项目中,Java源代码和测试代码的存放路径的位置。

2.1.4 编译和运行Maven项目

    Maven项目在创建完成后,需要手动对项目进行编译。并且,因为在测试代码中用到了Java原码中创建的HelloMaven这个类型,所以我们必须按照如下顺序对项目进行编译:
        1、首先编译src/main/java文件夹下的Java原码
        2、其次编译src/test/java文件夹下的测试代码

    只有按照这个顺序进行编译,才能够保证测试代码能够正常运行。

1、编译Java源代码:

    首先我们进入Maven项目的根目录下,然后通过如下命令对Maven项目中的源代码进行编译:

mvn compile

    注意:如果是第一次编译Maven项目,那么Maven将会从远程的中央仓库中下载所需的jar文件到本地仓库中。

    如果我们已经配置过使用镜像进行下载,那么这个下载过程将会快得多(为了进行演示,我把本地仓库中所有已经下载好的jar文件都删了……)。

 项目编译成功后将会有如下结果:

    首先是在命令控制台中会显示如下结果内容:

     其次是在src文件夹下,会出现一个名为target的新文件夹,这个文件夹中负责保存当前已经编译好的所有Java文件的字节码文件。

 2、编译并运行测试代码:

    Maven工程下的测试代码的编译和运行使用的是同一个命令:

mvn test

    也就是说,在运行上述命令的时候,Maven会同时执行如下3个操作:
        1、根据pom.xml配置文件中声明的项目使用的jar文件依赖,去中央仓库将所需的jar文件下载到本地仓库中。
        2、编译测试代码,生成其对应的字节码文件。
        3、直接执行测试类中的测试方法,打印测试结果。

下载jar文件到本地仓库的过程:

 编译测试文件并运行测试方法,得到运行结果:

 3、Maven项目的清理:

    如果需要清空已经编译生成好的Java原码和测试代码的字节码文件,我们可以使用如下命令:

mvn clean

Maven正在清理项目:

 清理完成:

 在运行这个命令后,Maven会自动删除项目根目录下的target文件夹:

     到此为止,我们手动创建、配置并编译、运行一个Maven项目的操作就全部结束了。

2.2 手动搭建Maven Web项目

    Maven Web项目只是比Maven Java项目多了一些结构,按照Maven约定构建即可。

2.2.1 web目录创建

    在src/main目录下创建webapp目录。webapp目录是web工程的主目录。

    之后就是按照Web工程进行操作,不再赘述。 

2.2.2 HelloServlet的创建

    在src/main/java目录下面创建com.maven.servlet包,在该下定义HelloServlet类。

HelloServlet类代码如下:

package com.maven.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().write("Hello.................");
	}

}

2.2.3 配置依赖和运行环境(后面详解)

<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>com.newcapec</groupId>
  <artifactId>HelloMaven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
	
	<!-- 添加servlet-api,jsp-api -->
	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		
	</dependencies>
  
</project>

2.2.4 运行测试    

    打开资料里面的HelloMaven,测试运行即可。

    进入Maven工程目录(当前目录有pom.xml文件),运行mvn tomcat:run命令。

    根据上边的提示信息,通过浏览器访问:http://localhost:8080/HelloMaven/HelloServlet

2.2.5 Maven Web项目报错处理

    问题一:可能存在jar包冲突。
        解决方案:在jsp 和 servlet的依赖中添加<scope>provided</scope>。

    问题二:Maven内置中的Tomcat是6.0,这个版本的不支持jdk1.8。
        配置tomcat7插件,同时配置maven编译环境为1.8。
        运行mvn tomcat7:run命令启动服务。如果继续用tomcat:run还是会使用Maven的Tomcat6;会继续出错…

<plugins>
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
</plugins>

2.3 命令测试

打开cmd命令行,进入hello项目根目录执行以下命令,查看根目录变化:

#编译:
mvn compile

#清空:
mvn clean

#测试:
mvn test

#打包:在打包之前先执行test命令,经过测试发现,并不会打包测试文件
mvn package

#把项目安装到本地仓库,在安装之前先执行package命令:
mvn install

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是波哩个波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值