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包里,再执行脚本。

相关文章
相关标签/搜索