maven打包oracle jdbc驅動

背景

因爲版權問題,maven中央倉庫缺乏oracle jdbc的驅動,這個給開發帶來了不少不便利性。也出現各類各樣的解決方案,基本就兩種思路:java

  • 將oracle驅動安裝到本地倉庫,這個須要你們統一好名稱和版本
  • 使用第三方倉庫

無論哪一種方案,原本maven就是爲了方便開發人員管理包依賴,這樣一來反而更麻煩。固然,不是maven的錯,oracle這事作的確實夠sb。(據說oracle要對java進行收費???)
那麼有沒有更好的方案,假設你如今開發了一個框架,框架支持多數據庫,而且已經將jar包提交至maven中央倉庫,若是你的jar包裏面就已經包含了oracle驅動,那麼使用框架的人就不用額外再去導入驅動。docker

這種方案有如下幾個小問題shell

  • 會不會有版權問題(這個不是很瞭解)
  • 驅動升級怎麼辦
  • 怎麼把驅動打到jar包裏

關於驅動升級問題,能夠對jar包發佈多個版本,好比純淨版不包含驅動,驅動xxx版包含不一樣版本的驅動。數據庫

本文主要探討的就是第三個問題,怎麼把驅動打到jar包裏apache

背景交代完畢,正文開始。bash

實現

遇到的問題

你可能以爲,這是個很簡單的事,經過idea的Artifacts不就好了。是的,若是你只是想在本地打一個jar包,這種方式簡單方便。但若是要上傳到maven,就得使用maven來打包,maven是無論你ide是怎麼配置的,並且maven不會將依賴包打到jar包裏的。有幾個方案能夠考慮oracle

  • 藉助maven插件maven-assembly-plugin能夠實現自定義打包,可是該插件是將依賴包所有放在lib目錄下,這個不是個人本意,個人本意是將依賴包裏的class文件解壓到根目錄下,和自開發的jar包同一個目錄下。(這個插件我研究了好久不能實現就放棄了,若是有知道怎麼實現的讀者歡迎留言)
  • 本身寫插件實現,其實難度也不大,就是麻煩點
  • 藉助maven腳本執行插件exec-maven-plugin執行自定義腳本對maven打包後的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>
  • phase:在打包這個生命週期結束後執行該腳本
  • executable:腳本目錄位置
  • arguments:傳給腳本的參數,這裏傳了三個參數
  • ${basedir}:當前目錄,就是項目所在目錄
  • ${project.build.directory}:maven構建目錄,就是target目錄
  • ${project.build.finalName}:maven打包名稱
  • /you/path/ojdbc6.jar:要打進去的jar包路徑

腳本

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

整個腳本的大概流程以下

  1. 建立一個臨時目錄v_workspace
  2. 將依賴包複製到臨時目錄下
  3. 解壓依賴包
  4. 刪除jar包和META-INF文件夾
  5. 將項目的jar包複製到臨時目錄下
  6. 遍歷全部文件夾,將文件夾經過命令jar -uf更新到項目jar包裏
  7. 用新的jar包替換掉老的jar包

寫在最後

如今腳本里只支持一個jar包,稍微修改下就能夠支持多個,或者你能夠在本身本地把多個jar包用jar -uf打到一個jar包裏,再執行腳本。

相關文章
相關標籤/搜索