maven进行依赖包管理,包的作用域,依赖包排除
1、对于maven项目而言,依赖包是它的绝对核心所在,所有的开发项目所需要*.jar文件都需要通过依赖包的形式来实现相关的配置,但是对于依赖包也需要注意两点问题:包的作用域、包的排除问题。
2、包的作用域。
在一般进行WEB项目开发的时候往往都会将所有的开发程序打包为一个*.war文件。那么在这个war文件里面就会存在有lib目录保存所有的第三方程序开发包文件,于是对于一些重要的开发包,那么就需要将其进行保存,如果不需要的开发包,不希望其输出到lib之中。
例如:junit往往只做测试使用,而实际项目发布的时候这个开发包根本就没有任何的用处,所以就不希望其可以自动的输出到war文件之中。
编写项目中的pom.xml配置文件:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gwolf</groupId>
<artifactId>crm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>crm Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdk.version>1.8</jdk.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>crm</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encode>${project.build.sourceEncoding}</encode>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<encode>${project.build.sourceEncoding}</encode>
</configuration>
<executions>
<execution>
<id>sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

3、随后来观察两个依赖包的定义情况:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

4、而scope就属于开发包的作用域,很明显的可以发现,当前的junit由于只是一个测试环境下的,所以使用了一个test的作用域。默认的作用域配置指的就是compile。

5、这个时候输出到lib目录下的只有compile范围的开发包,而test范围的开发包并没有输出到lib目录下,因为其设置的范围是test范围。

6、但是基本上大部分的情况下都会使用test或compile,但是有些开发包,例如:servlet程序包,这个开发包本身都会由tomcat容器提供,所以这个包只有在编译项目的时候有效,那么本质上也没有必要保存到lib目录下。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
这个时候如果在进行打包的时候,servlet开发包也不会自动的进行打包处理。

7、依赖包的排除。
发现在进行包的依赖控制的时候这个时候往往会发现存在有其他依赖关系。
我们的A项目去依赖B包的时候,发现B包又依赖于C包。但是我们的配置之中发现项目A也要去引用C包,这样依赖就有可能造成包的冲突,所以不希望B自动依赖的C包加入到项目的编译里面来,这样就需要进行一个包的排除处理。
原始的配置,存在有重复的依赖关系:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.gwolf</groupId>
<artifactId>crm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>crm Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.8</jdk.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>crm</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encode>${project.build.sourceEncoding}</encode>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<encode>${project.build.sourceEncoding}</encode>
</configuration>
<executions>
<execution>
<id>sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

8、实现包的排除处理:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.12.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

9、所以这个时候整个项目之中只会存在有一个公共的commons-logging的开发包存在。