说明
由于我目前所做的项目皆是java web项目,因此整个系统学习的过程也就以java web为基础。
maven项目结构
根据maven约定,一个比较标准的maven java web项目,结合eclipse通常可以看到结构如下:
src/main/java java主要代码存放目录
src/main/resources java配置文件存放目录
src/test/java java测试代码存放目录
JRE System Library jre中的一些jar包映射
Maven Dependencies 根据pom.xml配置的依赖而导入的jar包映射
src/main/webapp web相关的文件,如html等
src/test 这个目录暂时还没用过
target maven项目输出目录,例如生成多的war包
pom.xml maven项目最重要的一个文件
pom.xml文件说明
pom.xml文件格式
pom.xml文件是maven项目的灵魂所在,一个标准的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"\>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cmupay</groupId>
<artifactId>cmupay-coresys</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>cmupay-coresys</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml节点说明
这个文件中,首先是xml格式说明,接下来是pom.xml文件中的父节点<project>
project
project是pom.xml文件中的父节点(或者说根元素),节点中有一些属性配置,这些属性可以说不是必须的,但是一般都会写上,有了这些配置可以使一些工具更容易解析和编辑pom.xml文件,例如使用eclipse编辑。
modelVersion
<modelVersion>
指定了pom文件模板的版本,根据我的理解,和<project>
中的属性涉及到的版本应该一致。需要注意的是,对于maven2和maven3来说,只能是4.0.0。
groupId、artifactId及version
这三个元素可以说是pom.xml中最重要的元素,他们三个决定了当前maven项目的坐标唯一性,貌似可以理解成三维坐标的x、y、z三个坐标,然后决定了一个确定的点。
其中<groupId>
指定当前项目所属的组,一般可能就填写公司的网址,由于网址的唯一性,这个就不会重复,相当于三维坐标中从x轴定位;<artifactId>
指定了当前项目在当前组中的唯一ID,通常都是填写的项目名,同一个公司可能有多个项目,但不同项目有不同的编号和名称,相当于在三维坐标确定的x坐标位置再确定y坐标;
实际开发过程中,经常是以迭代的形式进行,因此不同的项目就会有很多个不同的版本,单独用项目名也不能确定项目的唯一性,通过<version>
指定项目版本,再结合前边两项,就能保证项目坐标的唯一性,这样在maven不同项目间的依赖上就能通过配置准确的获取配置的依赖项。
packaging
这里主要是指定项目打包时是生成什么形式的压缩包,例如通常web项目会填写“war”。
name和description
因为项目名称有时候可能并不能很好的表达该项目做什么,因此name元素可以用来声明一个更加友好的名称,同样的description是更加详细的项目描述。
properties
maven项目基础属性配置,通常会配置项目构建的字符集编码,输出,也就是打包文件的字符集以及jdk版本等。
dependencies
这里主要是项目依赖的配置,也就是通常所说的jar包配置,一个<dependencies>
里边可以有很多个<dependency>
元素,而<dependency>
里边就是实际依赖包的配置,配置的原理实际上就是上边描述过的项目坐标,通过<groupId>
、<artifactId>
和<version>
确定唯一的jar包。
当有了上述三个配置后,maven就会自动下载相应的jar包,至于具体是去哪里下载,就要涉及到一些其他的配置了,后续熟悉过程中再进一步说明。<dependency>
里边还有一个属性是<scope>
,指的是作用范围,如果是“test”,说明只在测试的时候生效,如果没有配置这个值,默认是"compile",表示对主代码和测试代码都生效。
build
build里边通常是对maven构建项目过程中需要用到的maven插件进行配置,例如上述例子中指定编译插件版本。
在实际使用过程中,我发现当配置了<properties>
中的jdk版本后,似乎不需要再在这里配置maven编译插件版本也可以,具体细节可能还需要在后续熟悉的过程中进一步了解。
maven常用命令
在maven构建项目的过程中,有几个比较常用的命令或者说操作,那就是编译、测试、打包、安装。这些命令可以再cmd窗口执行,但我通常结合eclipse使用,因此就记录在eclipse中使用的方法:
在项目名或者pom.xml右键——》run As——》maven build,然后在出现的界面的Goals中输入具体的命令(如果是在cmd命令行窗口,需要加入在前边加上mvn)
clean complie 编译
这个命令实际上会先执行clean,清除输出目录target中的所有内容,然后进行编译,把编译的文件放入到target目录中来。
clean test 测试
这个命令就是执行测试类里的测试代码,一般使用junit测试。需要注意的是,在执行test之前会下进行compile。
clean package 打包
这个操作一般是在项目开发完成后,生成可执行的jar包或者war包或者供其他项目调用的jar包。需要注意的是,在执行package之前会先依次执行compile和test。
clean install 安装
项目打包完成后,jar包输出在target目录下,而不是maven仓库,如果其他项目要依赖引用,就没有那么方便。使用install之后,maven就会把jar包安装到maven仓库中。
需要注意的是,执行install之前也会依次执行compile、test、package,所以实际上如果是要把项目压缩包放入到maven仓库,那么只需要执行install就够了。