maven中dependencyManagement 和pluginManagement的使用

廉鸿运
2023-12-01

        前边说了maven的modules,要明确的一点是:只有你的项目分成了若干个模块(可能是基于功能分模块,比如action模块,service模块,dao模块;也可能是基于业务分模块,比如user模块,order模块等),才有使用modules的必要。

        一个大中型Java项目中,一般由若干个module组成,各个module各司其职,担任整个工程中不同角色。大多数情况下,大多数module都会用到相同的jar包,或者插件。如果每个module中都引入自己喜欢的jar、插件,不仅冗余,而且太多冗余jar包,使得资源浪费。为了统一管理各个module中的library jar plugin,让所有子module都继承一个父pom.xml。有同学说,既然有了继承,我就直接在pom.xml   的 dependencies中声明module中需要的library,不就好了!想想如果有一些module中不需要这样的library,岂不是又要引进冗余jar。而dependencyManagement正好解决了这一问题,他在父pom.xml中,不会直接到repository中解析你定义的依赖,而是在子module中,如果你用到了dependencyManagement中声明的dependency包,这时你只需要声明包的groupid, artifactid,即可,因为dependencyManagement已经替你定义好了版本version,从而既实现了版本统一管理,又可以各取所需!从上面的叙述来看,dependencyManagement也是当你的项目分了若干模块之后,才有使用的必要,不然则没有必要去使用它。

        dependencyManagement用于在父项目中统一对子项目依赖管理,另外pluginManagement这个标签与dependencyManagement的作用也是类似的,即由父pom.xml定义该元素,可统一子项目中的插件。

举个使用了dependencyManagement和pluginManagement的pom.xml的例子,当然这个pom.xml一般是放在父模块中,即aggregation聚合的模块中的。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.zhao.cms</groupId>
  <artifactId>aggregation_extends</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <!-- 聚合各个模块,不用单独打包 -->
  <modules>
  <!-- userinfo指的是项目名称 -->
  	<module>../userinfo</module>
  	<module>../column</module>
  	<module>../service</module>
  </modules>
  <!-- 管理依赖,让各个模块继承 ,各个模块的依赖部分只用写ga就行了,其他部分重复的在各个模块
  中都可删掉,在这一个文件中管理jar,就很难出现jar重复的问题了,重复的jar只配一个就行了-->
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <dependencyManagement>
  <dependencies>
  <!-- 原本写在userinfo里的依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <!-- 编译,打包时不加入,默认为compile,servlet-api可设置为provider,mysql-conn可设置为runtime -->
      <scope>test</scope>
    </dependency>
      <dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-core</artifactId>
		<version>4.2.4.Final</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.15</version>
	</dependency>
    <dependency>
	     <groupId>${project.groupId}</groupId>
	      <artifactId>column</artifactId>
	      <version>${project.version}</version>
	  </dependency>
      <dependency>
	      <groupId>${project.groupId}</groupId>
	      <artifactId>userinfo</artifactId>
	      <version>${project.version}</version>
	    </dependency>
      
	 <dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>
  </dependencies>
  </dependencyManagement>
  <build>
  	<pluginManagement>
	  	<plugins>
	  		<plugin>
	  			<groupId>org.apache.maven.plugins</groupId>
	  			<artifactId>maven-compiler-plugin</artifactId>
	  			<version>3.0</version>
	  			<configuration>
	  				<source>1.6</source>
	  			    <target>1.6</target>
	  			</configuration>
	  		</plugin>
	  	</plugins>
  	</pluginManagement>
  </build>
  
</project>

 

 类似资料: