背景

由于版权问题,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

maven打包oracle jdbc驱动的更多相关文章

  1. Oracle Jdbc驱动下载及安装本地maven仓库

    由于二进制许可 binary license的限制,oracle jdbc驱动不能通过共有仓库来获取,所以你可以下载下来添加到自己的本地仓库或私有仓库中. 添加到本地仓库步骤如下: 下载Oracle ...

  2. Oracle JDBC驱动安装到Maven本地仓库

    Oracle JDBC驱动因为授权问题,没有放到Maven的中央仓库里面,当然了,阿里云的镜像也没有了.所以要从Oracle官网下载驱动: 注意下载ojdbc6.jar  因为这个JDK1.8才能用. ...

  3. maven添加oracle jdbc依赖

    maven添加oracle jdbc依赖 由于Oracle授权问题,Maven不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到 ...

  4. maven官方库中没有oracle jdbc驱动的问题解决

    1.找到可用的oracle jdbs驱动jar包文件,放置到指定目录(可根据实际自定义) D:\jdbc\ojdbc14.jar 2.安装好maven,主要是配置好环境变量 MAVEN_HOME='指 ...

  5. 解决maven官方库中没有oracle jdbc驱动的问题:Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0

    最近在整合SSHE项目时,想要添加Oracle驱动包时,Maven的pom.xml总是报Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0错, 下面我 ...

  6. 手动向Maven本地仓库添加ORACLE jdbc驱动

    一,当在maven工程中我们需要连接数据库的时候,只需要配置它的依赖就行,但是Maven不提供Oracle JDBC driver,由于Oracle授权问题它并没有提供,需要自己手动添加. 二,获取连 ...

  7. JAVA学习7:在Maven仓库中添加Oracle JDBC驱动

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 一.首先要得到Oracle ...

  8. maven上传jar包(oracle jdbc驱动)

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库.一.首先要得到Oracle J ...

  9. 在MAVEN仓库中添加ORACLE JDBC驱动

    本文转载自 http://www.cnblogs.com/leiOOlei/archive/2013/10/21/3380568.html 因为已经是第二次遇到,所以COPY过来,怕以后别人的BLOG ...

随机推荐

  1. Windows、Linux、Android常用软件分享

    Windows.Linux.Android常用软件分享 前言 本来没准备写这篇博客,一是没时间,还有其他很多优先级更高的事情要做.二是写这种博客对我自己来说没什么的帮助,以前我就想好了不写教程类,使用 ...

  2. iOS 监测电话呼入

    1.首先引入CoreTelephony框架,代码里: @import CoreTelephony; 项目设置里: 2.定义属性,建立强引用: @property (nonatomic, strong) ...

  3. Centos 6.x 搭建 Zabbix Agent 客户端

    如需搭建zabbix server端,请参考:Zabbix-Server配置 环境: Zabbix-Server: Centos 6.8   IP:192.168.126.129    #Zabix- ...

  4. net 配置文件处理视频

    1. 视频 <staticContent>      <mimeMap fileExtension=".mp4" mimeType="video/mp4 ...

  5. _bzoj1257 [CQOI2007]余数之和sum【小技巧】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1257 最近刚做了一道莫比乌斯的题,需要用到这种方法. 应该让k / i相等的一连串k % i ...

  6. 排序二叉树 HDOJ 5444 Elven Postman

    题目传送门 题意:给出线性排列的树,第一个数字是根节点,后面的数如果当前点小或相等往左走,否则往右走,查询一些点走的路径 分析:题意略晦涩,其实就是排序二叉树!1<<1000 普通数组开不 ...

  7. import和from .xxx import *的一点重要区别

    import zzz 不会导入zzz中已导入的模块 from .xxx import * 会导入xxx中已导入的模块 特别注意: 使用logging时,x模块导入了log.py,y模块导入了log.p ...

  8. ABP教程(四)- 开始一个简单的任务管理系统 - 实现UI端的增删改查

    接上一篇:ABP教程(三)- 开始一个简单的任务管理系统 – 后端编码 1.实现UI端的增删改查 1.1添加增删改查代码 打开SimpleTaskSystem.sln解决方案,添加一个“包含视图的MV ...

  9. dubbo系列--重要概念介绍

    dubbo架构图 节点角色说明 整体设计 proxyFactory:就是为了获取一个接口的代理类,例如获取一个远程接口的代理.它有2个方法,代表2个作用 getInvoker:针对server端,将服 ...

  10. Oracle创建用户及权限设置

    oracle用户创建及权限设置 权限: create session create table unlimited tablespace connect resource dba 例: #sqlplu ...