zoukankan      html  css  js  c++  java
  • Maven魔法堂:安装Oracle JDBC Driver依赖的那些坑

    前言

    由于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指定本地文件路径。依赖参与编译阶段,默认不会被打包到最终发布包。
      • 注意:systemPath必须以变量的方式指定,且路径不能为位于当前项目(如${basedir}/path/to/jarfile),否则使用新版Maven时将无法构建工程。
      • 对于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

  • 相关阅读:
    Python学习之路
    like's photos
    Django---子框架drf内容总结
    Django---子框架drf项目---路飞学城---前后端搭建
    Django---drf,JWT补充、基于就角色的权限控制(django内置auth体系)
    常见三种加密(MD5、非对称加密,对称加密)
    Django---drf,自定制频率、自动生成文档、JWT
    PEP8 常用规范
    Class meta
    Django---drf, books系列表接口、分页器、根据ip进行频率限制---作业
  • 原文地址:https://www.cnblogs.com/fsjohnhuang/p/13937146.html
Copyright © 2011-2022 走看看