zoukankan      html  css  js  c++  java
  • maven打包oracle jdbc驱动

    背景

    由于版权问题,maven中央仓库缺少oracle jdbc的驱动,这个给开发带来了很多不便利性。也出现各种各样的解决方案,基本就两种思路:

    • 将oracle驱动安装到本地仓库,这个需要大家统一好名称和版本
    • 使用第三方仓库

    不管哪种方案,本来maven就是为了方便开发人员管理包依赖,这样一来反而更麻烦。当然,不是maven的错,oracle这事做的确实够sb。(听说oracle要对java进行收费???)
    那么有没有更好的方案,假设你现在开发了一个框架,框架支持多数据库,并且已经将jar包提交至maven中央仓库,如果你的jar包里面就已经包含了oracle驱动,那么使用框架的人就不用额外再去导入驱动。

    这种方案有以下几个小问题

    • 会不会有版权问题(这个不是很了解)
    • 驱动升级怎么办
    • 怎么把驱动打到jar包里

    关于驱动升级问题,可以对jar包发布多个版本,比如纯净版不包含驱动,驱动xxx版包含不同版本的驱动。

    本文主要探讨的就是第三个问题,怎么把驱动打到jar包里

    背景交代完毕,正文开始。

    实现

    遇到的问题

    你可能觉得,这是个很简单的事,通过idea的Artifacts不就行了。是的,如果你只是想在本地打一个jar包,这种方式简单方便。但如果要上传到maven,就得使用maven来打包,maven是不管你ide是怎么配置的,而且maven不会将依赖包打到jar包里的。有几个方案可以考虑

    • 借助maven插件maven-assembly-plugin可以实现自定义打包,但是该插件是将依赖包全部放在lib目录下,这个不是我的本意,我的本意是将依赖包里的class文件解压到根目录下,和自开发的jar包同一个目录下。(这个插件我研究了很久不能实现就放弃了,如果有知道怎么实现的读者欢迎留言)
    • 自己写插件实现,其实难度也不大,就是麻烦点
    • 借助maven脚本执行插件exec-maven-plugin执行自定义脚本对maven打包后的jar包进行"改造"。

    最终选择了第三个方案,写shell脚本实现自定义打包

    配置

    首先引入插件的依赖
    pom.xml

    ```<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.sh

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

    原文地址:https://segmentfault.com/a/1190000017053861

  • 相关阅读:
    POJ 1984
    剑指offer 7. 斐波那契数列 & leetcode 剑指 Offer 10- I. 斐波那契数列
    剑指offer 60. 把二叉树打印成多行
    数据库的范式(建表的原则)
    剑指offer 59. 按之字形顺序打印二叉树
    力扣142.环形链表II & 剑指offer 55. 链表中环的入口结点
    GET 和 POST 的区别
    理解Cookie和Session的区别及使用
    基本排序算法代码实现,以及使用场景推荐
    The Castle OpenJ_Bailian
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9986644.html
Copyright © 2011-2022 走看看