因爲版權問題,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包裏,再執行腳本。