Maven魔法堂:安裝Oracle JDBC Driver依賴的那些坑

^_^肥仔John發表於2020-11-06

前言

由於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/fsjohnhuang/p/13937146.html —— ^_^肥仔John

相關文章