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

35次阅读

共计 2674 个字符,预计需要花费 7 分钟才能阅读完成。

前言

因为 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

正文完
 0