maven怎么做版本控制器(建议收藏)

上次发布一篇类似的文章,但是这次我补充了一些内容。

一、dependency相关配置

1.1、scope

test:只在测试时使用,打包时不用。

import:单继承。只能用在dependencyManagement里面,且仅用于type=pomdependency

1.2、type

dependency为什么会有type为pom,默认的值是什么?
dependency中type默认为jar即引入一个特定的jar包。那么为什么还会有type为pom呢?当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包。

二、dependencyManagement

间接依赖,主要作用是用来管理依赖。可以被继承,如果在这个元素中引入的依赖不会被加载进来,只有其他工程引入这个依赖之后才会被引入。一般用于父pom.xml中,而子工程dependency元素在依赖。

三、创建版本控制器

实现效果,我要向springboot版本控制器那样,只需要依赖我的这个版本控制器,就不用再依赖springbootspringcloud以及springcloudalibaba这些版本控制器了。在父工程引入我的这个依赖,在工程依赖部分模块实现相应的功能。就很好的避免重复的写同样的功能,只需要一个依赖就实现相同的功能了。

这样做的好处是。

1、如果自己很多项目需要实现相同的功能,那么我们只需要写一套代码,install到本地仓库或者私服里面,其他项目一个依赖就可以。

2、不用项目都需要去引用一大堆依赖,某个依赖更新时,设计的再好,只好每个项目需要在父工程中更改一次。就意味着项目更新比较麻烦,如果实现自定义版本控制器后,就可以向springboot版本控制器那样很好的管理版本,今后代码只维护一套,所有项目就得到解决。

这也是我策划已久的项目,也是我设计失败了三四个项目后取得的成就。

写法和普通多模块项目一样的,其他项目引入时采用springboot版本控制器的方式引入就可以了。

3.1、父pom.xml设计

在父pom.xml中,必须将packaging设置为pom,默认为jar。子工程需要设置为jar,但是默认就是jar,我们就可以忽略。

maven控制台install_jar

dependencies标签说明

dependencies标签中引入的依赖,每个子工程中也就自动继承了这里的依赖。所以只要在这个标签中引入的依赖,maven会将这个标签中的依赖加载到项目中,每个子模块不用再依赖就直接使用。

maven控制台install_maven_02

dependencyManagement标签说明

这个标签一般使用在父pom.xml中,在这个标签中引入的依赖,不会加载进来,在这里将依赖写好,版本号定义好。子模块引用这里面的依赖时,就避免写版本号了,只要子工程依赖,这里的依赖才会加载到项目中。所以这个标签一般用于版本控制,为了好维护版本号。

maven控制台install_jar_03

3.2、插件

安装一下两个插件,第一个是指定JDK版本。第二个是打包插件。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!--springboot 打包插件-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

如果某个子工程直接打成jar直接运行的,那么会遇见一下错误。

java -jar XXX.jar中没有主清单属性,建议收藏。

参考博客:

需要在需要运行的这个子工程中在添加以下插件,在插件中指定main方法的路径。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.2.2.RELEASE</version>
            <configuration>
                <!-- main方法的地址 只需要修改这个地址-->
                <mainClass>com.security.user.AuthServerApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3.2、子pom.xml设计

子工程里面,需要使用那些jar就直接依赖即可。

maven控制台install_maven_04

maven控制台install_maven控制台install_05

但是父pom.xml里面dependencies标签引入的依赖,所以子工程都可以不用引入了,可以直接使用。所以我习惯性说,dependencies里面是的直接依赖,dependencyManagement里面的是间接依赖。直接依赖的,所有子工程不用再依赖直接使用,间接依赖的,子工程需要重新引入才可以使用。

四、两个项目之间依赖关系讲解

依赖的使用和一个项目中不同模块依赖是一样的,多模块项目之间依赖关系,常常有之。

当我们在父项目中的父pom.xml直接依赖进来的jar,我们将父项目打成jar让子项目中引用。那么子项目中就不用再引入父项目中直接依赖进来的jar了。

例如:

maven控制台install_maven控制台install_06

maven控制台install_maven控制台install_07

maven控制台install_jar_08

五、子项目依赖父项目

依赖方式就像依赖springboot版本控制器那样依赖就行。

maven控制台install_jar_09

六、讲解子项目中为什么依赖这么少

6.1、子项目中父pom.xml依赖

maven控制台install_maven控制台install_10

6.2、子木块依赖

maven控制台install_spring_11

6.3、子项目为什么不需要其他的依赖了

maven控制台install_jar_12

七、将工程打包到本地仓库

参考博客:

install项目的时候,注意install父项目,因为你install某个子项目时,只会将那个子项目install到本地仓库,其他你是不能install进去的。就意味着引入父项目的那个依赖是不能引入的,因为本地仓库没有。

maven控制台install_maven_13

查看本地仓库

maven控制台install_maven_14

maven控制台install_spring_15

maven控制台install_maven控制台install_16

八、当前工程依赖当前模块注意(致命问题)

当前工程在父pom里面不能直接引用当前模块 ,引用了开发不会出现任何问题。但是无法打包,这是一个致命的问题。

maven控制台install_spring_17

九、另外的项目打包到其他项目时注意

9.1、场景描述

有些时候开发项目时为了给打包成jar给其他工程使用,而不是直接启动做一个项目。pom.xml配置应该注意一下问题。

maven控制台install_maven_18

<!-- 如果这个依赖是打包给其他工程引用,那么一下这个插件不能引入。否则不能条用当前模块中的方法和类。-->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!-- main方法的地址 只需要修改这个地址-->
        <mainClass>com.control.oauth.NmAuthApplication</mainClass>
    </configuration>
</plugin>

如果这个模块是打成jar包直接启动使用的,如果不指定这个插件,那么也是启动不了的,会包找不到清单。

参考:

9.2、另一个项目中依赖格式

我在nm-XX模块添加上这个插件,然后使用 mvn clean install -Dmaven.test.skip=true命令添加到本地仓库。

maven控制台install_maven_19

maven控制台install_maven控制台install_20

通过这样描述,你就很明确的发现,那些应用应该添加这个插件,指定main()方法所在的类。而那些方法又不能添加这个插件了吧。