JavaEE Maven学习记录

292 阅读6分钟

本文已参与 [新人创作礼] 活动 , 一起启动掘金创作之路!


概念

目录布局

Maven创建项目,目录结构都是有标准的模板

目录说明
src/main/java应用程序的源代码的目录
src/main/resources项目的源文件所在的目录
src/main/filters资源筛选器文件
src/main/webappWeb 应用程序源
src/test/java测试代码所在的目录
src/test/resources测试资源
src/test/filters测试资源筛选器文件
src/it集成测试(主要针对插件)
src/assembly装配描述符
src/site网站
pom.xml核心配置文件,项目的描述文件
target项目构建的输出文件
LICENSE.txt项目许可证
NOTICE.txt项目所依赖的库所需的通知和归属
README.txt项目的读物

仓库

专门 存放Maven项目的位置

本地仓库

本地上的一个文件夹。首次应用会从远程仓库进行下载的,下次应用会在本地找,没有则下载远程

远程仓库

中央仓库

官方提供的仓库 ,也是 Macen的默认仓库

私服

局域网内架设私有的仓库服务器,用于提供外部远程仓库应用

配置本地仓库

根目录\conf\setting.xml 文件的 settings节点里 添加以下代码

我的本地存储位置在 D:\Maven\repository

<!-- 配置本地仓库 -->
<localRepository>D:\Maven\repository</localRepository>

配置远程仓库

Macen 默认仓库是 境外,下载速度慢、不便捷

于是我们选择使用 国内阿里云Macen仓库作为中央仓库镜像

根目录\conf\setting.xml 文件的 mirrors节点里 添加以下代码(更改为阿里云Macen仓库)

<!-- 配置阿里云镜像 -->
<mirror>
    <!-- 镜像的唯一标识 -->
	<id>nexus-aliyun</id>
    <!-- 镜像名称 -->
	<name>Nexus aliyun</name>
    <!-- 镜像仓库 Maven地址 -->
	<url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
    <!-- 配置是否为中央仓库镜像,如果是,则central -->
	<mirrorOf>*</mirrorOf>
</mirror>

核心文件pom.xml

POM是 Maven 工程的基本工作单元,是一个XML文件,包含 了项目的基本信息,用于描述项目如何构建,声明项目依赖

执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

<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">
<!-- Maven模型的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如
com.companyname.project-group,Maven会将该项目打成的jar包放本地路
径:/com/companyname/project-group -->
<groupId>com.Maven</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>HelloWorld</artifactId>
<!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
<!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号
当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本
-->
<version>0.0.1-snapshot</version>
<!--打包类型,一般有jar、war、pom等-->
<packaging>jar</packaging>
<!-- 名称:可省略 ,常用于 Maven 生成的文档。-->
<name>Hello</name>
<!--项目描述:可省略,常用于 Maven 生成的文档-->
<description></description>
<!-- 项目依赖构件配置,配置项目依赖构件的坐标 -->
<dependencies>
    <!-- 依赖设置 ,可以有多个dependency节点-->
    <dependency>
        <!-- 依赖组织名称 -->
        <groupId>junit</groupId>
        <!-- 依赖项目名称 -->
        <artifactId>junit</artifactId>
        <!-- 依赖版本名称 -->
        <version>4.12</version>
        <!-- 依赖范围:test包下依赖该设置 -->
        <scope>test</scope>
    </dependency>
</dependencies>
<!-- 项目构建配置,配置编译、运行插件等。-->
<build>
	<plugins>
        <!--插件-->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.8.0</version>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
	</plugins>    
</build>
</project>

packaging

packaging标签选项,指定项目的类型

项目类型一共有:

  • jar :Java工程
  • pom :聚合工程
  • war :Web工程

dependencies

dependencies标签选项,指定依赖的jar包集,搭配 dependency标签实现

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
	</dependency>
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.2.8</version>
	</dependency>
</dependencies>

坐标

Maven世界中有大量的构件,需要唯一标识的坐标就可以找到我们想要的坐标(其原理类似于平面几何中的坐标 x、y进行标识唯一位置的点)

Maven坐标组成部分:

groupId: 当前Maven项目组织名称

artifactId: 实际项目名称

version: 当前项目的版本 或 所依赖jar包的版本

生命周期

Maven拥有三套生命周期,他们相互独立互不干扰

clean 清理项目

阶段说明
pre-clean在实际项目清理之前执行所需的流程
clean删除上一个版本生成的所有文件
post-clean执行完成项目清洁所需的流程

default 构建项目(核心)

阶段说明
generate-resources生成资源以包含在包中
process-resources将资源复制并处理到目的地目录中,准备进行包装
compile编译项目的源代码
test-compile将测试源代码编译到测试目的地目录中
test使用合适的单位测试框架运行测试。这些测试不应要求对代码进行包装或部署
install将封装安装到本地存储库中,以用作本地其他项目的依赖
deploy在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享
······

注意:运行任何一个阶段的时候,它前面的所有阶段都会被运行

site 生成项目站点

阶段说明
pre-site在实际项目站点生成之前执行所需的流程
site生成项目的站点文档
post-site执行完成站点生成和准备站点部署所需的过程
site-deploy将生成的站点文档部署到指定的 Web 服务器

参考文档:maven.apache.org/index.html

IDEA应用Maven项目

IDEA配置

  1. 打开所有设置(必须在这里打开设置,否则其他项目无效)
  2. 设置Maven项目目录
  3. 运行环境

Java项目的创建

有骨架

  1. 创建项目,选择骨架
  2. 配置项目基本信息
  3. 确认信息

无骨架

只需关闭选中,其他步骤跟有骨架的一致

无骨架创建项目需要自行配置 pom.xml

手动将Maven文件夹补齐

JavaWeb项目的创建

有骨架

步骤就一步不一样,其他剩下步骤就不赘述了!

无骨架

无骨架创建项目后,需要自行配置 JavaWeb信息

  1. 项目配置
  2. 手动添加Web目录
  3. 添加创建内容

构建项目

添加Tomcat插件无需运行本地的Tomcat

  1. 配置 pom.xml

     <!--配置war包-->
    <packaging>war</packaging>
    
    <!--添加jar依赖-->
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <!--添加插件-->
    <build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.0</version>
                <!--Tomcat配置-->
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  2. 运行配置

常用命令

Maven命令需要在 pom.xml 所在目录中执行

mvn compile

生成 target目录,该目录中存放了编译后的字节码文件

mvn clean

删除 target目录

mvn test

在 target目录 中生成,surefire、 surefire-reports(测试报告)、test-classes(测试的字节码文件)三个文件夹

mvn package

在 target目录 中生成本项目的 jar包war包

mvn install

将打包好的 jar包 安装到本地仓库,方便其他工程应用

组合命令

组合命令,严格遵守生命周期的执行顺序!

  • mvn clean compile
  • mvn clean test
  • mvn clean package
  • mvn clean install

IDEA命令执行

根据下图双击即可运行相应的命令!

Maven依赖

依赖管理

项目依赖管理 ,pom.xml 文件中定义jar包的GAV坐标

<dependencies>
	<dependency>
        <!--依赖 GAV坐标-->
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
        <!--依赖范围-->
		<scope>test</scope>
	</dependency>
</dependencies>

依赖范围(scope)

依赖范围用于限制依赖的环境应用,指定何时提供依赖及分类路径

依赖范围值(scope)说明
compile(默认值)项目的所有类路径中提供
(为所有类编译提供依赖)
provided编译和测试时需要,jar包不进行打包
(以防运行环境已经存在相同的包发生冲突)
runtime测试、运行时需要
test测试时需要,但不进行打包
······
依赖范围主类编译路径测试编译路径打包且编译时有效
compileYYY
providedYY-
runtime--Y
test-Y-

依赖传递

在项目往往需要引入多个依赖, 而引入的依赖又会引入其他的依赖,项目会自动引入依赖中的依赖!

假设 A项目 引入 B 和 E 依赖 ,他们有各自的依赖关系

A => B B => C C => D A => E E => D

  A项目
  |
  ├── B
  │   └── C
  │       └── D(2.0)
  └── E
      └── D(1.0)

最后 A项目 导入了D(1.0),排除D(2.0)

系统会根据导入的就近原则进行依赖应用

依赖排除

Maven 的依赖传递过程可选择性的排除依赖。如果依赖中有其他依赖可对其进行排除!

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.11</version>
	<!--排除依赖-->
	<exclusions>
		<exclusion>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-core</artifactId>
            <!--排除依赖无需版本号-->
		</exclusion>
	</exclusions>
</dependency>

PS:排除依赖包中所包含的依赖关系,不需要添加版本号

假如我想在 上面假设中排除D(1.0),引入D(2.0)

···
<!--引入B依赖-->
<dependency>
	<groupId>B</groupId>
	<artifactId>B</artifactId>
	<version>0.1</version>
   	<!--排除依赖-->
	<exclusions>
        <!--排除 B依赖 中的 依赖C-->
		<exclusion>
			<groupId>D</groupId>
			<artifactId>D</artifactId>
            <!--排除依赖无需版本号-->
		</exclusion>
	</exclusions>
</dependency>
<!--引入E依赖-->
<dependency>  
	<groupId>E</groupId>
	<artifactId>E</artifactId>
	<version>0.1</version>
</dependency> 
···