1、相关名词
1 Project: 任何你想build的事物,maven都可以认为他们是工程,这些工程被定义为工程对象模型(POM:Project Object Model)一个工程可以依赖其他的工程,一个工程也可以有多个子工程构成。
2 POM: 就是xml文件,是maven的核心文件,它是Maven如何工作的元数据文件。POM文件位于每个工程的根目录中。
3 GroupId: groupId是一个工程在全局唯一的标识符,一般,他就是包名。GroupId有利于使用一个完整的包名,将一个工程从其他有类似名称的工程里区别出来。
4 Artifact: artifact是工程将要产生或者需要使用的文件,他可以是jar文件、源文件、二进制文件、war文件、甚至是pom文件。每个artifact都有groupId和artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到他们。
5 Dependency: 为了能够bulid或者运行,一个典型的java工程会依赖其他的包。在Maven中,这些被依赖的包就被称为dependency。Dependency一般是其他工程的jar。
6 Plugin: Maven是由插件组成的,它的每一个工程/功能都是由插件提供的。插件提供goal,并根据在POM中找到的元数据去完成工作。主要的Maven插件都是由java写成的,但是也支持用Beanshell或者Ant脚本写的插件。
7 Repository: 仓库。
2、pom.xml文件配置
1. 常用的基础结构
一个基本的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- 依赖项 -->
</dependencies>
<build>
<!-- 构建配置 -->
</build>
</project>
2. 添加依赖
在部分添加你项目的依赖。例如,添加Spring Boot的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
3. 配置插件
在部分配置Maven插件,例如配置Maven Compiler插件以指定Java版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
4. 配置属性
你可以在部分定义项目属性,以便在pom.xml中重用:
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.5.4</spring-boot.version>
</properties>
然后在依赖中引用这些属性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
5. 配置仓库(可选)
如果你需要使用不在Maven中央仓库中的依赖,可以在pom.xml中配置仓库:
<repositories>
<repository>
<id>my-repo</id>
<url>http://myrepository.com/repo</url>
</repository>
</repositories>
6. 父项目(可选)
如果你的项目继承自另一个项目,可以使用parent元素:
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0</version>
</parent>
7.全景配置标签解释
主要标签大致分下面几类:
坐标(Coordinates): groupId、artifactId、version ,这三个组合在一起可以唯一锁定项目在仓库中的位置
聚合(Aggregation): modules (一个项目可以分N个模块)
继承(Inheritance): parent、 dependencyManagement
依赖(Dependences): dependences
项目工程2信息(Project Information): name、description、url…
构建配置(Build Settings): properties、 packaging(打包方式)、 build (构建信息)、reporting(报告)
环境信息(Environment):…
- project
<project > :文件的根节点。(固定的)
- modelversion
<modelversion > :pom.xml使用的对象模型版本(一般也都是4.0.0版本)
- groupId
<groupId > :创建项目的组织或团体的唯一Id。
- artifactId
<artifactId > :项目的唯一Id, 可视为项目名。
- version
<version > :产品的版本号。
注意:groupId ,artifactId ,version 这三个称之为项目坐标,因为这三个组合在一起可以唯一锁定项目在仓库中的位置,因此,如果要寻找一个项目,先要获得其项目坐标,格式:仓库/groupId/artifactId/version/项目包(jar、war)
- packaging
<packaging > :打包类型,一般有jar、war、pom 等
jar包 ------- 简单java项目
war包 ----- web项目
pom ----- 父项目,提供pom被子项目继承
- name
<name > :项目的显示名,常用于 Maven 生成的文档。
问题:关于artifactId、name、工程名是否必须一致?
三者可以不一致!
其作用区别是什么?
通过两个测试:
1、如果使用tomcat:run 运行项目,访问项目通过 artifactId 属性
2、在项目编译打包、安装部署,还是使用artifactId属性
通过测试发现:Name属性只是用来生成文档中显示,不会影响到工程发布和打包等,写什么都无所谓。而工程本身的名字也对工程发布和打包没有影响,也无所谓。
- description
<description > :项目描述,常用于 Maven 生成的文档
- dependencies/dependency
完整的dependency 配置如下:
1、groupId、artifactId、version是依赖的基本坐标,“缺一不可”,其它两个坐标元素不指定时将采用默认值(找到jar的位置)(当version没有的情况下,会自动使用依赖默认的版本)
2、type:依赖的类型,对应坐标packaging方式,(它通常表示依赖的文件的扩展名),默认为jar。
3、optional:标记依赖是否可选。A->B->C,那么当A依赖于C时就可以设为可选。一般不配置。
4、exclusions:排除传递依赖,即某些依赖项目不想导入进来。(主要用来解决版本冲突问题)
5、依赖范围: scope
compile :编译需要,打包需要 (大多数的jar都是这种)-默认值
provided :编译需要,不会被打包 (servlet、jsp)
runtime: 编译不需要,打包运行时需要(jdbc驱动)
test: 参与测试,不会打包 (junit)
常用标签如下,所有的依赖都必须放到<dependencies>标签元素中,即一个项目可以依赖多个其他项目。如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
exclusions排除依赖示例:
应用场景:当两个依赖项目都依赖于另外一个项目的不同版本的时候,就可以通过排除依赖,将不要的版本排除掉。
maven依赖有个特性:如果你依赖一个项目的两个版本,maven只会导入一个版本的项目。
scope 的依赖范围
- properties
<!-- 统一维护版本-定义本地属性 -->
<properties>
<spring.version>3.2.0.RELEASE</spring.version>
<struts2.version>2.3.15.2</struts2.version>
</properties>
- plugins
1.maven-compiler-plugin编译插件
2.maven-surefire-plugin测试插件
主要功能是输出日志和报告。
可解决两个问题:
1.中文乱码问题
解决方法:通过覆盖超级pom的默认配置来增加一个配置属性
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>
2.跳过测试
3 .tomcat-maven-plugin使用 tomcat
使用tomcat:run 命令,默认使用 tomcat-maven-plugin:1.1 运行 ,使用8080端口
如何修改端口?
添加插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<!—可选,指定端口-->
<port>9090</port>
</configuration>
</plugin>
乱码:
覆盖为utf-8
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.baidu.maven</groupId>
<artifactId>storemanagermaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>storemanagermaven</name>
<description>仓库管理系统的maven工程</description>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<!-- 版本统一维护 -->
<properties>
<spring.version>3.2.0.RELEASE</spring.version>
<struts2.version>2.3.15.2</struts2.version>
<hibernate.version>3.6.10.Final</hibernate.version>
<mysql.version>5.1.6</mysql.version>
<ehcache.version>2.6.6</ehcache.version>
<c3p0.version>0.9.1.2</c3p0.version>
</properties>
<!-- spring -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
<!-- struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.15.2</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.3.15.2</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.15.2</version>
</dependency>
<!-- 其他 -->
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 缓存 :必须2系列的版本-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.6</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- jdbc driver -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
<scope>runtime</scope>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>