1. 认识 maven
maven
的两个作用:
- 依赖管理:当项目所依赖的第三方包比较多的时候,自己管理依赖就会变得越来越困难
- 可以快捷构建项目:清理、编译、测试、报告、打包和部署
maven 安装
maven 仓库
maven
仓库分为本地仓库、远程仓库和*仓库:
- 本地仓库:远程仓库下载的依赖包所存储的位置,本地项目直接从本地仓库获取依赖
- 远程仓库(如阿里云):本地没有的依赖,可以去远程仓库下载,可以是互联网内也可以是局域网内
- *仓库:
maven
团队自己维护的仓库,包含了世界上大部分流行的开源项目构件
<!--conf/settings.xml 远程仓库地址设置-->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
maven 工程的目录结构
.settings // 工具生成的文件
src/ // 源代码
main/
java/ // 放入项目的源码
resources/ // 放入配置文件
webapp/ // 页面素材
test/ // 单元测试
java/ // 测试的源码
resources/ // 测试的配置文件
target // 编译生成的文件,项目输出位置,编译后的 class 文件输出到此目录
.classpath
.project
.tern-project
pom.xml // maven 工具的配置文件,如坐标信息
2. maven 命令
1、编译 compile
mvn compile
编译,将 src/main/java
下的文件编译为 class
文件输出到 target/
目录
2、测试
mvn test
测试,执行 src/test/java
下的单元测试类
3、清理 clean
mvn clean
会删除 target
目录及内容
4、打包 package
mvn package
打包 java
工程,web
项目会打包成 war
包
5、安装 install
mvn install
将项目打成 jar
包或 war
包发布到本地仓库
maven
指令的生命周期
maven
对项目构建过程分为三套相互独立的生命周期:
-
Clean Lifecycle
:构建之前进行清理 -
Default LifeCycle
:构建的核心部分,编译、测试、打包和部署等 -
Site LifeCycle
:生成项目报告,站点,发布站点
3. pom.xml 文件
pom.xml
文件可以定义项目的坐标、依赖、项目信息、插件目标等
<project></project> <!--文件根节点-->
<modelversion></modelversion> <!--pom.xml 使用的对象模型版本-->
<name></name> <!--项目显示名,常用语 maven 生成的文档-->
<description></description> <!--项目描述,常用于 maven 生成的文档-->
<build></build> <!--项目构建配置,配置编译、运行插件等-->
<!--依赖关系,坐标都放在 dependencies 标签内-->
<dependencies>
<dependencie>
<groupid>junit</groupid> <!--junit 项目名称-->
<artifactId>junit</artifactId> <!--junit 模块名称-->
<version>4.9</version> <!--依赖版本 snapshot 为快照版本非正式版,release 为正式版-->
<scope>test</scope> <!--依赖范围:单元测试时使用 junit-->
<!--打包类型:jar 包、war 包-->
<packaging>jar</packaging>
</dependencie>
</dependencies>
坐标来源(当不知道坐标的时候可以在以下网站搜索):
- https://search.maven.org/
- https://mvnrepository.com/
依赖范围 scope
A 依赖 B 需要在 A 的 pom.xml
文件中添加 B 的坐标,并且需要指定依赖范围,依赖范围包括:
-
compile
:编译范围,A 在编译时依赖 B,为默认范围,会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包 -
provided
:只有在JDK
或一个容器已提供该依赖后才使用,在编译和测试时需要,运行时不需要 -
runtime
:在运行和测试系统时需要,编译时不需要 -
test
:编译和运行时不需要,只有在测试编译和测试运行阶段时可用 -
system
:与provided
类似,但需显示地提供一个对于本地系统中jar
文件的路径,不推荐使用
设置 JDK 编译版本
设置编译版本为 1.8:
<build>
<plugins>
<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>
</build>
4. 常用打包插件
4.1 maven-jar-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix> <!--指定依赖包-->
<mainClass>com.xxg.Main</mainClass> <!-- main 文件-->
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
mvn package
打包后会将依赖包拷贝到 target/lib
下,可以直接 java-jar xxx.jar
执行,但是生成的 jar
太多不便于管理,不推荐
4.2 maven-assembly-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>com.xxg.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
打包命令:mvn package assembly:single
,生成一个 target/xxx-jar-with-dependencies.jar
文件,也可以使用 mvn package
命令打包,但需要加上以下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>com.xxg.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<!--表示执行打包时,执行 assembly:single-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果项目中用到Spring Framework
,用这种方式打出来的包运行时会出错
4.3 maven-shade-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxg.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
mvn package
打包会生成两个 jar 包,一个包含依赖,另外一个不包含依赖,推荐使用