maven怎么做版本控制器(建议收藏)
上次发布一篇类似的文章,但是这次我补充了一些内容。
一、dependency相关配置
1.1、scope
test
:只在测试时使用,打包时不用。
import
:单继承。只能用在dependencyManagement
里面,且仅用于type=pom
的dependency
。
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
版本控制器那样,只需要依赖我的这个版本控制器,就不用再依赖springboot
和springcloud
以及springcloudalibaba
这些版本控制器了。在父工程引入我的这个依赖,在工程依赖部分模块实现相应的功能。就很好的避免重复的写同样的功能,只需要一个依赖就实现相同的功能了。
这样做的好处是。
1、如果自己很多项目需要实现相同的功能,那么我们只需要写一套代码,install
到本地仓库或者私服里面,其他项目一个依赖就可以。
2、不用项目都需要去引用一大堆依赖,某个依赖更新时,设计的再好,只好每个项目需要在父工程中更改一次。就意味着项目更新比较麻烦,如果实现自定义版本控制器后,就可以向springboot版本控制器那样很好的管理版本,今后代码只维护一套,所有项目就得到解决。
这也是我策划已久的项目,也是我设计失败了三四个项目后取得的成就。
写法和普通多模块项目一样的,其他项目引入时采用springboot版本控制器的方式引入就可以了。
3.1、父pom.xml设计
在父pom.xml
中,必须将packaging
设置为pom
,默认为jar
。子工程需要设置为jar
,但是默认就是jar
,我们就可以忽略。
dependencies
标签说明
在dependencies
标签中引入的依赖,每个子工程中也就自动继承了这里的依赖。所以只要在这个标签中引入的依赖,maven
会将这个标签中的依赖加载到项目中,每个子模块不用再依赖就直接使用。
dependencyManagement
标签说明
这个标签一般使用在父pom.xml
中,在这个标签中引入的依赖,不会加载进来,在这里将依赖写好,版本号定义好。子模块引用这里面的依赖时,就避免写版本号了,只要子工程依赖,这里的依赖才会加载到项目中。所以这个标签一般用于版本控制,为了好维护版本号。
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
就直接依赖即可。
但是父pom.xml
里面dependencies
标签引入的依赖,所以子工程都可以不用引入了,可以直接使用。所以我习惯性说,dependencies
里面是的直接依赖,dependencyManagement
里面的是间接依赖。直接依赖的,所有子工程不用再依赖直接使用,间接依赖的,子工程需要重新引入才可以使用。
四、两个项目之间依赖关系讲解
依赖的使用和一个项目中不同模块依赖是一样的,多模块项目之间依赖关系,常常有之。
当我们在父项目中的父pom.xml
直接依赖进来的jar
,我们将父项目打成jar
让子项目中引用。那么子项目中就不用再引入父项目中直接依赖进来的jar
了。
例如:
五、子项目依赖父项目
依赖方式就像依赖springboot版本控制器那样依赖就行。
六、讲解子项目中为什么依赖这么少
6.1、子项目中父pom.xml依赖
6.2、子木块依赖
6.3、子项目为什么不需要其他的依赖了
七、将工程打包到本地仓库
参考博客:
install
项目的时候,注意install
父项目,因为你install
某个子项目时,只会将那个子项目install
到本地仓库,其他你是不能install
进去的。就意味着引入父项目的那个依赖是不能引入的,因为本地仓库没有。
查看本地仓库
八、当前工程依赖当前模块注意(致命问题)
当前工程在父pom
里面不能直接引用当前模块 ,引用了开发不会出现任何问题。但是无法打包,这是一个致命的问题。
九、另外的项目打包到其他项目时注意
9.1、场景描述
有些时候开发项目时为了给打包成jar
给其他工程使用,而不是直接启动做一个项目。pom.xml
配置应该注意一下问题。
<!-- 如果这个依赖是打包给其他工程引用,那么一下这个插件不能引入。否则不能条用当前模块中的方法和类。-->
<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
命令添加到本地仓库。
通过这样描述,你就很明确的发现,那些应用应该添加这个插件,指定main()
方法所在的类。而那些方法又不能添加这个插件了吧。