Maven依赖范围的定义和作用
Maven的依赖范围用于控制依赖与编译、测试和运行三种classpath的关系。不同的依赖范围决定了依赖在项目构建的不同阶段是否有效。Maven主要有以下几种依赖范围:
compile:编译依赖范围。默认情况下使用该依赖范围,对于编译、测试和运行三种classpath都有效。适用于在所有阶段都需要使用的依赖,例如spring-core。
provided:已提供依赖范围。编译和测试时需要,但在运行时由外部环境提供。适用于由容器提供的库,例如servlet-api。
runtime:运行时依赖范围。编译时不需要,但在运行时需要。适用于JDBC驱动程序等库。
test:测试依赖范围。仅在测试阶段需要,不会包含在最终的构建包中。适用于JUnit等测试框架。
system:系统依赖范围。与provided类似,但需要在本地文件系统中指定路径。通常不推荐使用,因为它与系统绑定,可能导致构建不可移植。
每种依赖范围的具体应用场景和效果
compile:
适用于所有阶段,例如spring-core在编译、测试和运行时都需要使用。
默认情况下使用该依赖范围。
provided:
适用于由容器提供的库,例如servlet-api。在编译和测试时需要,但在运行时由Tomcat等容器提供,因此不需要重复引入。
例如,在编译和测试时需要servlet-api,但在运行时由Tomcat提供。
runtime:
适用于JDBC驱动程序等库。编译时不需要,但在运行时需要。
例如,JDBC驱动程序在编译主代码时不需要,但在执行测试或运行项目时需要。
test:
仅在测试阶段需要,不会包含在最终的构建包中。
例如,JUnit等测试框架仅在测试时需要。
system:
与provided类似,但需要在本地文件系统中指定路径。通常不推荐使用,因为它与系统绑定,可能导致构建不可移植。
例如,某些特定平台的本地库可能需要使用system范围。
将依赖打入模块jar包
<plugins>
<!--主要用于将 Maven 项目打包成可执行的程序或分发包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<!--预定义的描述符格式-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id><!--名字任意 -->
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal><!-- 只运行一次 -->
</goals>
</execution>
</executions>
</plugin>
注意:依赖的jar包在pom中配置的作用范围需要为默认compile