Maven打包插件—— maven-dependency-plugin 的使用

maven-dependency-plugin插件的使用

maven-dependency-plugin是处理与依赖相关的插件。它有不少可用的goal,大部分是和依赖构建、分析和解决相关的goal,这部分goal能够直接用maven的命令操做,例如:mvn dependency:tree、mvn dependency:analyze;这类操做在平时的maven应用中不多会用到。这里主要介绍除此以外的、用得最多的几个操做:copy, copy-dependencies和它们对应的unpack, unpack-dependencieshtml

首先声明插件:java

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
            <version>2.8</version>  
        </plugin>  
    </plugins>  
</build>

copy 和 unpack

copy操做能够用来将某个(些)maven artifact(s)拷贝到某个目录下。添加phase和goal以下:web

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
            <version>2.8</version>  
            <executions>  
                <execution>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>copy</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>

而后就是配置,copy能够的配置的项比较多,详细的请参考:copy配置。下面是一些经常使用项说明:spring

Name Type Since Descriptionapache

artifactItems List 1.0 Collection of ArtifactItems to work on. (ArtifactItem contains groupId, artifactId, version, type, classifier, outputDirectory, destFileName and overWrite.) See Usage for details.
outputDirectory File 1.0 Default output location used for mojo, unless overridden in ArtifactItem.
Default value is: ${project.build.directory}/dependency.
User property is: outputDirectory.
prependGroupId boolean 2.7 Prepend artifact groupId during copy
Default value is: false.
User property is: mdep.prependGroupId.
  • prependGroupId: 用来指示拷出来的library名字须要不须要加上groupId,默认是不加
  • outputDirectory: 用来指定拷出后Libraries的存放地

这里除了artifactItems没有默认值,须要指定外,全部其余的选项均可以被忽略:app

<configuration>  
    <artifactItems>  
        <artifactItem>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
        </artifactItem>  
    </artifactItems>  
</configuration>

以上配置会将junit包拷到target/dependency目录下,文件名为:junit-4.11.jar。less

若是想把它拷到lib目录下,能够以下配置:eclipse

<configuration>  
    <artifactItems>  
        <artifactItem>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
        </artifactItem>  
    </artifactItems>  
    <outputDirectory>lib</outputDirectory>  
</configuration>

或者:maven

<configuration>  
        <artifactItems>  
            <artifactItem>  
                <groupId>junit</groupId>  
                <artifactId>junit</artifactId>  
                <version>4.11</version>  
                <outputDirectory>lib</outputDirectory>  
            </artifactItem>  
        </artifactItems>  
    </configuration>

根据上面的说明,artifactItem里能够有如下几个参数:ide

  • groupId 
  • artifactId
  • version
  • type
  • classifier
  • outputDirectory
  • destFileName
  • overWrite

一样的参数,artifactItem里的优先级更高,例如:

<configuration>  
        <artifactItems>  
            <artifactItem>  
                <groupId>junit</groupId>  
                <artifactId>junit</artifactId>  
                <version>4.11</version>  
            </artifactItem>  
            <artifactItem>  
                <groupId>org.slf4j</groupId>  
                <artifactId>slf4j-log4j12</artifactId>  
                <version>1.7.7</version>  
                <outputDirectory>lib2</outputDirectory>  
            </artifactItem>  
        </artifactItems>  
        <outputDirectory>lib</outputDirectory>  
    </configuration>

其中junit会拷到lib目录下,由于它没有定义本身的outputDirectory;slf4j-log4j12会拷到lib2下,由于它定义了本身的outputDirectory。

unpack和copy相似,只不过它会把拷来的包解开,例如:

<executions>  
    <execution>  
        <phase>package</phase>  
        <goals>  
            <goal>unpack</goal>  
        </goals>  
    </execution>  
</executions>  
<configuration>  
    <artifactItems>  
        <artifactItem>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
        </artifactItem>  
        <artifactItem>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-log4j12</artifactId>  
            <version>1.7.7</version>  
            <outputDirectory>lib2</outputDirectory>  
        </artifactItem>  
    </artifactItems>  
    <outputDirectory>lib</outputDirectory>  
</configuration>

则junit和slf4j-log4j12拷完之后,放到lib和lib2下的再也不是Jar包,仍是Jar包里的内容。 

 

copy-dependencies 和 unpack-dependencies

上面介绍的copy 和 unpack操做是由要拷某个包,这个包须要具体指定要拷哪一个包,与当前工程的依赖没有关系。copy-dependencies和它有点相似,可是它是用来拷当前工程的依赖包的,典型的,例如咱们有一个web应用,当打成war包的时候,它全部的依赖也须要被打到应用中。

copy-dependencies的参数有不少,详细的能够参考:copy-dependencies Doc,可是几乎全部都有默认值。因此一个最简单的定义以下:

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.8</version>  
    <executions>  
        <execution>  
            <phase>package</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>

这里没有指定任何配置,全部的参数都用默认值,则当前工程的全部依赖(直接、间接的)都会被拷到target/dependency目录下。

也可使用outputDirectory指定存放在。另外,如下几个参数能够控制哪些依赖将被拷出(或排除):

Name Type Since Description

excludeArtifactIds String 2.0 Comma separated list of Artifact names to exclude.
User property is: excludeArtifactIds.
excludeClassifiers String 2.0 Comma Separated list of Classifiers to exclude. Empty String indicates don't exclude anything (default).
User property is: excludeClassifiers.
excludeGroupIds String 2.0 Comma separated list of GroupId Names to exclude.
User property is: excludeGroupIds.
excludeScope String 2.0 Scope to exclude. An Empty string indicates no scopes (default).
User property is: excludeScope.
excludeTransitive boolean 2.0 If we should exclude transitive dependencies
Default value is: false.
User property is: excludeTransitive.
excludeTypes String 2.0 Comma Separated list of Types to exclude. Empty String indicates don't exclude anything (default).
User property is: excludeTypes.
includeArtifactIds String 2.0 Comma separated list of Artifact names to include.
User property is: includeArtifactIds.
includeClassifiers String 2.0 Comma Separated list of Classifiers to include. Empty String indicates include everything (default).
User property is: includeClassifiers.
includeGroupIds String 2.0 Comma separated list of GroupIds to include.
User property is: includeGroupIds.
includeScope String 2.0 Scope to include. An Empty string indicates all scopes (default). The scopes being interpreted are the scopes as Maven sees them, not as specified in the pom. In summary:
  • runtime scope gives runtime and compile dependencies,
  • compile scope gives compile, provided, and system dependencies,
  • test (default) scope gives all dependencies,
  • provided scope just gives provided dependencies,
  • system scope just gives system dependencies.

User property is: includeScope.
includeTypes       String 2.0 Comma Separated list of Types to include. Empty String indicates include everything (default).
User property is: includeTypes.

例如当前工程有如下依赖:

<pluginManagement>
	<plugins>
		<plugin>
			<groupId>org.eclipse.m2e</groupId>
			<artifactId>lifecycle-mapping</artifactId>
			<version>1.0.0</version>
			<configuration>
				<lifecycleMappingMetadata>
					<pluginExecutions>
						<pluginExecution>
							<pluginExecutionFilter>
								<groupId>org.apache.maven.plugins</groupId>
								<artifactId>maven-dependency-plugin</artifactId>
								<versionRange>[2.0,)</versionRange>
								<goals>
									<goal>copy-dependencies</goal>
								</goals>
							</pluginExecutionFilter>
							<action>
								<ignore />
							</action>
						</pluginExecution>
					</pluginExecutions>
				</lifecycleMappingMetadata>
			</configuration>
		</plugin>
		
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<version>2.6</version>
			<executions>
				<execution>
					<id>copy-resources</id>
					<phase>package</phase>
					<goals>
						<goal>copy-resources</goal>
					</goals>
					<configuration>
						<outputDirectory>${project.build.directory}/${project.artifactId}</outputDirectory>
						<resources>
							<resource>
								<directory>${basedir}/src/main/resources</directory>
							</resource>
						</resources>
					</configuration>
				</execution>
			</executions>
		</plugin>
        <!-- 针对sprong boot web项目打包 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>2.6</version>
			<configuration>
				<excludes>
					<exclude>conf/**</exclude>
					<exclude>templates/**</exclude>
					<exclude>static/**</exclude>
				</excludes>
				<argLine>-Dfile.encoding=UTF-8</argLine>
			</configuration>
			<executions>
                <execution>
                        <id>copy-current-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classifier>${project.version}</classifier>
                            <jarName>${project.artifactId}</jarName>
                            <outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
                        </configuration>
                </execution>
            </executions>
		</plugin>
		
		<plugin>
			<artifactId>maven-source-plugin</artifactId>
			<version>2.1</version>
			<executions>
				<execution>
					<phase>compile</phase>
					<goals>
						<goal>jar</goal>
					</goals>
					<configuration>
						<excludes>
							<exclude>conf/**</exclude>
							<exclude>templates/**</exclude>
							<exclude>static/**</exclude>
						</excludes>
					</configuration>
				</execution>
			</executions>
		</plugin>
       <!-- 复制依赖包 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<version>2.8</version>
			<executions>
				<execution>
					<id>copy</id>
					<phase>package</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
					<configuration>
					<outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
						<includeScope>compile</includeScope>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</pluginManagement>

要排除全部scope为test的依赖:

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.8</version>  
    <executions>  
        <execution>  
            <phase>package</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
        </execution>  
    </executions>  
    <configuration>  
        <includeScope>compile</includeScope>  
    </configuration>  
</plugin>

注意:这里不能<excludeScope>test</excludeScope>,这样会把全部compile级别的也排除。看下图: 

Copied From: Dependencies Scopes

scope/phase-> compile test run assembly
compile U U U U
provided U ! ! !
runtime ! U U U
test ! U ! !

说明:最左侧是表示dependency的scope级别,顶行表示maven的阶段,能够看出:compile级别的dependency会在全部阶段都被使用。

 

要排除全部camel的依赖,以下:

<configuration>  
    <excludeGroupIds>org.apache.camel</excludeGroupIds>  
</configuration>

要排除除camel-spring外的全部其余依赖以下:

<configuration>  
    <includeArtifactIds>camel-spring</includeArtifactIds>  
</configuration>

 

 

 

 

maven-dependency-plugin

<execution>:执行单元

id:标识

phase:在哪一个阶段执行 如 package

goals-goal:执行的操做:copy、copy-dependencies、unpack、unpack-dependencies 四种

<configuration>:执行单元内的配置

type: 类型 jar

includeTypes: jar

outputDirectiry:存放的路径 project.build.directory标识 target目录

excludeTransitive:是否排除间接依赖 默认false 不排除

stripVersion:是否消除依赖jar包后缀的版本信息 默认是false 不取消版本信息

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <type>jar</type>
                <includeTypes>jar</includeTypes>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
                <!-- 是否排除间接依赖 默认false 不排除 -->
                <excludeTransitive>false</excludeTransitive>
                <!-- 是否消除依赖jar包后缀的版本信息 默认是false 不取消版本信息-->
                <stripVersion>false</stripVersion>
            </configuration>
        </execution>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>4.11</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>
                    ${project.build.directory}/lib/libs
                </outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>4.11</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>
                    ${project.build.directory}/lib/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

若是:goals-goal:为 copy 或者 unpack 的话 configuration中能够加多个artifactItem 信息 进行打包

copy : 拷贝指定jar包 到指定目录

copy-dependencies : 拷贝依赖jar包 到指定目录

unpack : 解压指定jar包到指定目录

unpack-dependencies : 解压依赖jar包到指定目录

相关文章
相关标签/搜索