文章目录
- Maven的作用和好处
- Maven的三种打包方式区别(jar、war、pom)
- Maven的依赖解析机制scope
- Maven打包插件(maven-assembly-plugin)
Maven的作用和好处
Maven 是专门用于构建和管理Java相关项目的工具。maven的两大核心是:
- 依赖管理:就是对jar的统一管理过程;
- 项目构建:项目编码完成后,对项目进行编译、测试、打包、部署一系列的操作都通过命令来实现。
Maven的好处:
- 不再拷贝jar包。项目不需要存放jar包,导致项目源代码小。
- 使用maven开发的工程,如果环境统一,导入别的maven的项目不会报错。
- 代码耦合度进一步降低。
- 方便项目进行升级。
- 节省人力成本。
Maven的三种打包方式区别(jar、war、pom)
- jar:工程的默认打包方式,打包成jar用作jar包使用。存放一些其他工程都会使用的类,工具类。我们可以在其他工程的pom文件中去引用它,包括发布接口供别人调用。
- war:war包用来发布服务,打成war包后部署到服务器后用户可以通过浏览器直接访问,或者是通过发布服务被别的工程调用。
- pom:用在父级工程或聚合工程中,用来做jar包的版本控制,pom打包方式可以作为其他项目的maven依赖,构建maven项目时可用在父级工程或者聚合工程中,用来做jar包的版本控制;
注:打包方式在多模块项目中有具体的体现。
- jar、war、pom项目的内容发生改变时,对其他应用的影响
A的jar包发生改变时,如果是B调用了A的jar包中的接口,则需要A先将jar包重新deploy,然后B删除本地仓库(repository)中的jar包,compile之后即报红。- A的war包内容发生改变时,需要先将…???,;,;,;,;,;,;,;,;,;,;,;
A需要引用B的接口,B的接口修改之后,在修改artifact之后deploy到远程,给对方坐标依赖,即可创建一个临时的测试包。接口的实现变了,但是参数和返回值没有变,对方不用更新,但是当接口的参数和返回值发生改变时,需要重新拉取。
deploy项目到私服(分releases库和snapshots库)
<!-- 配置远程发布到私服,mvn deploy -->
<distributionManagement>
<!-- 定义releases库的坐标 -->
<repository>
<id>releases</id>
<name>Nexus Release Repository</name>
<url>http://192.168.0.126:8081/nexus/content/repositories/releases/</url>
</repository>
<!-- 定义snapshots库 -->
<snapshotRepository>
<id>snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.168.0.126:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
Maven的依赖解析机制scope
- 当依赖的范围是system时,尝试从本地仓库中寻找依赖
- 根据依赖坐标定位依赖位置后,尝试从本地仓库中寻找依赖,若找到,则解析成功;若找不到,则从settings.xml文件中配置的远程仓库中查找;
- 如果依赖的版本是RELEASE或LATEST,则读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地元数据合并后,计算出RELEASE和LATEST的真实值,然后做第二步;
- 如果依赖的版本为SNAPSHOT,类似的,读取远程仓库的元数据,并与本地元数据合并,计算出最新版本的快照,再从本地仓库和远程仓库检索
dependencyManagement和dependencies区别:一个是项目依赖,一个是maven项目多模块情况时作依赖管理控制的。
Maven打包插件(maven-assembly-plugin)
怎么用?
- 需要指定一个Assembly描述符文件。该文件指定了打包格式,包含的文件/过滤的文件等信息,可以同时指定多个描述符文件,打包成不同的格式。
<assembly>
<!-- id则是添加到打包文件名的标识符,用来做后缀-->
<id>package</id>
<!-- formats是assembly插件支持的打包文件格式,有zip、tar、tar.gz、tar.bz2、jar、war,可以同时定义多个format,按上面的配置,生成的文件就是groupId−artifactId−{version}-package.zip-->
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets> <!--用来设置一组文件在打包时的属性-->
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>bin</outputDirectory>
</fileSet>
<fileSet>
<directory>script</directory>
<outputDirectory>bin</outputDirectory>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>conf</outputDirectory>
<excludes>
<exclude>com/</exclude>
</excludes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope> <!--表示符合哪个作用范围的依赖会被打包进去。compile与provided都不用管,一般是写runtime-->
</dependencySet>
</dependencySets>
</assembly>
- 在Maven工程的pom.xml文件里配置maven-assembly-plugin插件,引入Assembly描述符文件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
按照以上配置打包好后,将.tar.gz文件上传到服务器,解压之后就会得到bin、conf、lib等规范化的目录结构,十分方便。