因为版权问题,maven中央仓库缺乏oracle jdbc的驱动,这个给开发带来了不少不便利性。也出现各类各样的解决方案,基本就两种思路:java
无论哪一种方案,原本maven就是为了方便开发人员管理包依赖,这样一来反而更麻烦。固然,不是maven的错,oracle这事作的确实够sb。(据说oracle要对java进行收费???)
那么有没有更好的方案,假设你如今开发了一个框架,框架支持多数据库,而且已经将jar包提交至maven中央仓库,若是你的jar包里面就已经包含了oracle驱动,那么使用框架的人就不用额外再去导入驱动。docker
这种方案有如下几个小问题shell
关于驱动升级问题,能够对jar包发布多个版本,好比纯净版不包含驱动,驱动xxx版包含不一样版本的驱动。数据库
本文主要探讨的就是第三个问题,怎么把驱动打到jar包里
apache
背景交代完毕,正文开始。bash
你可能以为,这是个很简单的事,经过idea的Artifacts
不就好了。是的,若是你只是想在本地打一个jar包,这种方式简单方便。但若是要上传到maven,就得使用maven来打包,maven是无论你ide是怎么配置的,并且maven不会将依赖包打到jar包里的。有几个方案能够考虑oracle
lib
目录下,这个不是个人本意,个人本意是将依赖包里的class文件解压到根目录下,和自开发的jar包同一个目录下。(这个插件我研究了好久不能实现就放弃了,若是有知道怎么实现的读者欢迎留言)最终选择了第三个方案,写shell脚本实现自定义打包框架
首先引入插件的依赖
pom.xmlmaven
<build> <plugins> <plugin> <artifactId>exec-maven-plugin</artifactId> <groupId>org.codehaus.mojo</groupId> <executions> <execution> <id>asan</id> <phase>package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>${basedir}/scripts/package.sh</executable> <arguments> <argument>${project.build.directory}</argument> <argument>${project.build.finalName}</argument> <argument>/Users/asan/u01/docker/lib/ojdbc6.jar</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build>
target
目录package.shide
v_workspace=$1/tmp v_name=$2.jar v_depency=$3 v_depency_name=`basename $3` echo "workspace==>$v_workspace" echo "name==>$v_name" echo $v_depency echo $v_depency_name rm -rf $v_workspace mkdir -p $v_workspace cp $v_depency $v_workspace cd $v_workspace jar -xf $v_workspace/$v_depency_name rm -rf $v_workspace/$v_depency_name rm -rf META-INF/ cp $1/$v_name $v_workspace for file in `ls $v_workspace` do if [ -d $file ] then jar -uf $v_workspace/$v_name $file fi done rm -rf $1/$v_name mv $v_workspace/$v_name $1/$v_name
整个脚本的大概流程以下
v_workspace
jar -uf
更新到项目jar包里如今脚本里只支持一个jar包,稍微修改下就能够支持多个,或者你能够在本身本地把多个jar包用jar -uf
打到一个jar包里,再执行脚本。