利用maven-dependency-plugin插件使用及场景
背景:
1.需要某个特殊的 jar包,但是有不能直接通过maven依赖获取,或者说在其他环境的maven仓库内不存在,那么如何将我们所需要的jar包打入我们的生产jar包中。
2.某个jar包内部包含的文件是我们所需要的,或者是我们希望将它提取出来放入指定的位置 ,那么除了复制粘贴,如何通过maven插件实现呢
maven-dependency-plugin插件
dependency 插件我们最常用到的是 dependency:copy dependency:copy-dependencies 及dependency:unpack dependency:unpack-dependencies 这四个,如果要实现上述的两种场景,我们需要的 是 第一个和第三个。
dependency:copy:takes a list of artifacts defined in the plugin configuration section and copies them to a specified location, renaming them or stripping the version if desired. This goal can resolve the artifacts from remote repositories if they don't exist in either the local repository or the reactor.(将一系列在此插件内列出的artifacts ,将他们copy到一个特殊的地方,重命名或者去除其版本信息。这个可以解决远程仓库存在但是本地仓库不存在的依赖问题)。
其依赖配置如下:
<!--dependency plugin test start-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<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>
<outputDirectory>${project.build.directory}/lib/lib1</outputDirectory>
</artifactItem>
<artifactItem>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
<outputDirectory>${project.build.directory}/lib/lib1</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
我们将两个指定的jar包junit slf4j-log4j12 分别输出到${project.build.directory}/lib/lib1 目录下 即${project.basedir}/target/lib 目录下。
但是这样达到我们的 目的没有呢,这是没有的 我们希望将这些指定的 输出的文件打包到我们的war包中以方便在任何环境内都能正常运行。
大家是否还记得上篇博客:http://www.cnblogs.com/lianshan/p/7348093.html、
利用maven-assembly-plugin加载不同环境所需的配置文件的assembly.xml 文件定义的,fileSet定义的,我们可以将指定目录下的 文件输出到我们的war包结构中,好比这样
<fileSet>
<directory>${project.build.directory}/lib/lib1</directory>
<outputDirectory>lib</outputDirectory>
<directoryMode></directoryMode>
<fileMode></fileMode>
</fileSet>
这样我们就将copy 出来的 文件放到了war包中,完美的解决了我们的需求,很实用于一些现实场景。

那么问题来了,如果我们想将某个jar包的一部分提取出来我们应该怎么做呢,我们是不是因该打开jar包呢 。
dependency:unpack : like copy but unpacks. 这是官网的 解释,懂了吧 。
打个比方,dubbo这个jar包封装了启动命令脚本,现在我们要上生产了,我们希望生产环境利用这个启动命令进行项目的启动,那么在jar包就肯定不行了,那么我们怎么将这些提取出来呢,当然只能打开了啊

搜我们通过这样的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<outputDirectory>${project.build.directory}/dubbo</outputDirectory>
<includes>META-INF/assembly/**</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
我们将assembly 下的 文件输出到target/dubbo目录下。

是不是这样就达到我们的效果了,成功将这个文件从jar包中抽取出来了,至于怎么放入我们的包中,那也就是和上面一样了 ,我们利用assembly配置将我们希望的目录下的 文件封装到war包中了。到这里,我们是不是就知道这个maven插件可以做些什么了。
其实具体的配置在官网上都能找到答案,maven插件的使用,官网都提供了详细的教程,及具体的示例,具体的详细配置可参考apache官网:http://maven.apache.org/components/plugins/maven-dependency-plugin/plugin-info.html
本文的目的,是清楚的告诉你一个插件 能做什么样的事,我们要做什么样的事,需要什么样的插件,大家各司其职,协同工作。
我们才能在我们要做这件事的时候找到它,使用它,而不至于完全没有方向。
互联网发展到今天,大多问题都有了良好的解决方案,前人的智慧是无穷的,同时,不是所有人都适合创造,那么至少可以将他人创造的,用精、用好,何尝不是一种发扬。
利用maven-dependency-plugin插件使用及场景的更多相关文章
- maven release plugin插件
1.打包版本区别 SNAPSHOT 快照版本(开发阶段,不稳定,容易出现bug)RELEASE 正式版本(外部依赖使用阶段,稳定,很少出现bug)Tag :标记每次代码提交的版本(比较稳定,类似分支) ...
- 利用maven中resources插件的copy-resources目标进行资源copy和过滤
maven用可以利用如下配置进行资源过滤,pom.xml的配置如下: <build> <!-- 主资源目录 --> <resources> <resource ...
- Maven版本管理-Maven Release Plugin插件
一.什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基 ...
- [转]利用maven的surefire插件实现单元测试与集成测试
原文链接 http://my.oschina.net/dlpinghailinfeng/blog/301136 maven单元测试与集成测试 通过maven的Profile 配置生命周期 通过mave ...
- 记录一次maven打包时将test目录下的类打包到jar中,Maven Assembly Plugin的使用
今天有人问我打包后找不到主类,运行的类写在test中.按照常规,test目录下的文件不会打包到jar包中.(但是我测试一个springboot工程就可以,这里之后再研究) 具体解决如下 第一步:在po ...
- 利用 Maven 创建 Docker 镜像并且推送到私有注册中心
利用 Maven 命令生成项目框架 mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darchetype ...
- 学习Maven之Maven Enforcer Plugin
1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...
- 利用Maven打包时,如何包含更多的资源文件
首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...
- 利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)
前言 本文旨在利用maven搭建ssm环境,而关于maven的具体内容,大家可以去阅读<Maven 实战>.其实园内这方面文章已有不少,那么为什么我还要重复造轮子呢?我只是想记录自己的实践 ...
随机推荐
- 开启mysql日志及若干问题
今天学习了mysql日志功能,以前也有所了解,只不过没有深入的学习,所以趁着“余热”,把我从网上找到的资料与实践 结合起来,总结一下其基本用法.学习从来都不是无趣的,就看你怎么看待学习. 1.查看查询 ...
- IOC和AOP的一些基本概念
IOC和AOP的一些基本概念介绍 IOC 介绍 IOC 一.什么是IOC IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不 ...
- Socket 进行发送
最灵活的通信方式还是Socket ,TcpClient和Tcplistener只是对Socket进行了一些包装,从而使他们使用起来更简单一些 给出同步的服务器端 static void Main(st ...
- ios开发之 -- invalid nib registered for identifier
今天在写代码的时候,碰到这麽一个问题: invalid nib registered for identifier (重用符) - nib must contain exactly one top l ...
- iOS7Status bar适配
一 Status bar重叠问题: - Zherui if ([[[UIDevicecurrentDevice] systemVersion] floatValue] >= 7.0) { sel ...
- js 中 this 的指向问题
高程上的大前提: 1.this 对象是在运行时基于函数的执行环境绑定的:在全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象:不过,匿名函数的执行环境具 ...
- node.js使用require给flume提交请求
node.js使用require给flume提交请求 - 简书 https://www.jianshu.com/p/02c20e2d011a 玄月府的小妖在debug 关注 2017.04 ...
- 小程序 当button遇上Flex布局
当需要将button按行排列,当超过一行时,可以换行,从左到右排列,想实现如下效果(实现的比较粗糙,能说明问题就行,呵~~~): 使用Flex布局,在设置主轴方向上对齐方式,使用justify-con ...
- Spark 源码分析 -- BlockStore
BlockStore 抽象接口类, 关键get和put都有两个版本序列化, putBytes, getBytes非序列化, putValues, getValues 其中putValues的返回值为P ...
- React中ref的用法
在React数据流中,父子组件唯一的通信方式是通过props属性:那么如果有些场景需要获取某一个真实的DOM元素来交互,这时候就要用到React的refs属性. 1.可以给DOM元素添加ref属性 c ...