文章目录

  • 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包的版本控制;

注:打包方式在多模块项目中有具体的体现。

  1. jar、war、pom项目的内容发生改变时,对其他应用的影响
    A的jar包发生改变时,如果是B调用了A的jar包中的接口,则需要A先将jar包重新deploy,然后B删除本地仓库(repository)中的jar包,compile之后即报红。
  2. 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)

怎么用?

  1. 需要指定一个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>
  1. 在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等规范化的目录结构,十分方便。