Maven魔法堂:安装Oracle JDBC Driver依赖的那些坑

熵桥流沙
• 阅读 366

前言

由于Oracle并没有向公开Maven仓库提供任何Oracle JDBC Driver的Jar包,因此我们无法像MySQL、SQLite等那么轻松直接通过Maven加载依赖。
而手动下载Oracle JDBC Driver Jar包,然后安装到本地仓库(.m2目录),再通过Maven加载依赖则是常用手段。但此外我们还能通过<scope>system</scope>的方式引入,但其中的坑下面将细细道来。

手动安装到本地仓库

  1. 将ojdbc7-12.1.0.2.jar放置到项目根目录的lib目录下,随项目进行版本管理;
  2. 在POM.xml文件中加入依赖定义;
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>
  1. 安装JAR包到本地仓库。
# 在项目根目录下执行
mvn install:install-file -Dfile=./lib/ojdbc7-12.1.0.2.jar -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar

scope为system在SpringBoot中的坑

除上述方式外,我们可以在POM.xml将依赖定义为

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/ojdbc7-12.1.0.2.jar</systemPath>
</dependency>

那么即使本地仓库(.m2目录)下没有Oracle JDBC Driver依赖,执行mvn compilemvn spring-boot:run依然成功执行。
请注意,执行mvn package打包出来的SpringBoot UberJar包中没有包含Oracle JDBC Driver依赖,那么直接部署到服务器上则报如下错误:

application failed to start

Description:
..................................
Reason: Failed to load driver class oracle.jdbc.driver.OracleDriver in either of HikariConfig class loader or Thread context classloader.

Action:
Update your application's configuration

解决方法:

  1. 对于外置Web容器的SpringBoot应用,则将Oracle JDBC Driver Jar包放置在容器的lib目录下;
  2. 对于内置Web容器的SpringBoot应用,则修改spring-boot-maven-plugin插件配置即可,具体请见下文。

说说Maven依赖定义中的scope属性

作用:用于限制依赖在Maven项目各生命周期的作用范围。

  • compile,默认值,依赖将参与编译阶段,并会被打包到最终发布包(如Jar、War、UberJar)内的Lib目录下。具有传递性,即该依赖项对于依赖当前项目的其它项目同样生效;
  • provided,依赖将参与编译阶段但不会被打包到最终的发布包,运行阶段由容器或JDK提供。不具备传递性。(如Servlet API,JSP API,Lombok等);
  • runtime,依赖不参与编译阶段(即不加入到classpath),但会打包到最终发布包,从而参与运行和测试阶段。通常用于根据配置文件动态加载或接口反射加载的依赖(如JDBC驱动);
  • test,依赖参加编译阶段,但不打包到最终发布包,依赖仅参与测试阶段;
  • system,表示该依赖项的路径为基于文件系统的Jar包路径,并且必须通过systemPath指定本地文件路径。依赖参与编译阶段,默认不会被打包到最终发布包。

    • 对于Spring Boot项目,若要将scope为system的Jar包打包到发布包,则需要配置spring-boot-maven-plugin

      <build>
          <plugins>
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <configuration>
                      <includeSystemScope>true</includeSystemScope>
                  </configuration>
              </plugin>
          </plugins>
      </build>
  • import,Maven2.0.9新增的scope值。仅能在<dependencyManagement>中使用,用于引用其它项目的依赖项。

    • 示例

      <!-- 引入项目io.fsjohnhuang.deps的依赖项 -->
      <dependencyManagement>
          <dependency>
              <groupId>io.fsjohnhuang</groupId>
              <artifactId>deps</artifactId>
              <type>pom</type>
              <scope>import</scope>
          </dependency>
      </dependencyManagement>
    • 关于type pom
      若项目拥有大量依赖项,那么会导致当前项目的POM.xml文件臃肿,即使采用父POM依然无法很好地解决该问题。而通过type为pom的项目则可以将依赖项分打包为独立项目,然后其它业务系统项目则可以通过引入这些项目导入相关依赖项,从而精简POM文件。
    • 关于type属性
      默认的type属性值为jar,即Maven将项目编译打包为Jar包,当设置为pom时则表示该项目为一堆相关依赖项的打包定义而已,当设置为apk或ejb等时则表示Maven在编译打包时采用andriod或ejb相关的插件执行任务。

总结

好记性不如烂笔头,Maven功能强大的背后自然也蕴藏着大量的知识点,记下来以便日后查阅!

转载请注明来自:https://www.cnblogs.com/fsjoh... —— ^_^肥仔John

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Maven项目使用打包时使用本地jar包库
在使用maven管理项目时,有时候我们可能会使用一些第三方的jar包依赖库,但是这些jar包依赖库又没有在共有的maven仓库。通常只能下来放到本项目的lib目录下。但是我们打包时如果不做处理,那么打包后的fatjar中不会有lib文件夹中的相关jar包。打包后无法运行起来,因此需要做特殊处理,让maven打包时能够把使用到外部jar打进去。主要就是在
Stella981 Stella981
3年前
Maven第四篇【私有仓库、上传jar包、引用私服jar包、上传本地项目到私服】
搭建私有服务器前面已经说过了,我们使用Maven的使用,如果需要导入相对应的jar包,Maven首先会在我们的本地仓库中寻找—私有仓库—中心仓库…然而,我们的本地仓库常常没有想要的jar包的,而经常去中心仓库下载这就非常浪费时间和资源了…因此我们一般都有一个私有仓库…另外有些公司都不提供外网给项目组人员,因此就不能使用mave
Stella981 Stella981
3年前
SpringBoot 引入本地或第三方Jar包
在开发过程中,我们会遇到一些Maven仓库没有的Jar包的情况,比如公司其他团队开发的Jar包等。这时我们就不能通过Pom文件引入。这里我们使用hutoolJar为例。一、使用Maven命令把Jar包添加到本地仓库(1)执行maven命令,把Jar添加到本地。mvninstall:installfileDfile/Us
Stella981 Stella981
3年前
Maven命令将本地jar打包到maven仓库
一、背景日常开发中,常见的一种情况是在java项目的pom.xml文件中引入依赖版本信息,由于maven中央仓库没有这个jar,我们可以从其他地方下载下来,然后再使用打包方式将下载下来的jar包打包到maven仓库。二、示例1\.依赖ojabc6引入!在这里插入图片描述(https:/
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Idea下maven的配置和使用
  maven的主要功能就是依赖管理,jar包仓库。和C中的NuGet仓库差不多。另外也提供打包构建,启动插件等功能。下面主要讲一下,在使用Idea开发时,maven的配置和使用。maven的安装和配置  maven(3.6.1)的下载地址:https://idlestudio.ctfile.com/fs/14960372382