在Maven仓库中查找Oracle JDBC驱动程序

309

我想将oracle jdbc驱动程序添加到我的项目依赖项(运行时范围)- ojdbc14。 在MVNrepository网站上,放置在POM中的依赖关系如下:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.3.0</version>
</dependency>

当然,这不起作用,因为它不在Maven使用的中央仓库中。 2个问题:

  1. 我该如何找到包含该构件的存储库(如果有)?

  2. 我该如何将其添加以便Maven使用它?


2
http://maven-repository.com/artifact/com.oracle/ojdbc14/ - Vadzim
1
ojdbc6在公共Maven仓库中:https://dev59.com/fmkw5IYBdhLWcg3wbqAS - Vadzim
21个回答

426

如何找到包含此工件的仓库(如果有)?

由于二进制许可证的原因,很遗憾没有公共存储库包含Oracle Driver JAR。这种情况发生在许多依赖关系中,但这不是Maven的错。如果您找到包含JAR的公共存储库,那么可以确定这是非法的。

如何添加使Maven使用它?

一些由于许可证原因无法添加的JAR在Maven中央存储库中有一个条目。只需检查它,其中包含供应商的首选Maven信息:

<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.3.0</version>

在这种情况下,要下载文件的URL是http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

下载完JAR文件后,只需使用以下命令将其添加到计算机存储库中(请注意,我从POM中提取了groupId、artifactId和version):

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 \
     -Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=ojdbc.jar -DgeneratePom=true

生成POM的最后一个参数可以避免pom.xml警告

如果您的团队有本地Maven仓库,这个指南可能对将JAR上传到仓库有所帮助。


1
这些不是settings.xml中的行,而是一个命令,一旦你有了JAR文件,该命令将把它添加到你的本地存储库中。 - victor hugo
15
针对OJDBC6,以下是需要进行的操作:
  1. 运行命令:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true
  2. 在pom.xml文件中添加以下内容:<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency>
- oskarae
11
我想知道为什么Oracle如此丑陋,不在乎公众对它的所有判断。即使在这些小事情上,比如公开他们自己免费图书馆的可用性,也很糟糕。 - Askar Kalykov
有没有找到ojdbc14源代码的机会? - Alex
8
据 https://dev59.com/z3NA5IYBdhLWcg3wI6R4#27943380 所述,Oracle 现在托管这样的仓库。 - SilverNak
显示剩余8条评论

63

Oracle JDBC驱动程序现在可在Oracle Maven存储库中获得(而不是中央存储库)。

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc7</artifactId>
    <version>12.1.0.2</version>
</dependency>

Oracle Maven存储库需要用户注册。说明可以在以下链接中找到:

https://blogs.oracle.com/dev2dev/get-oracle-jdbc-drivers-and-ucp-from-oracle-maven-repository-without-ides

更新于2019年10月3日

我注意到Spring Boot现在正在使用来自Maven Central的Oracle JDBC驱动程序。

<dependency>
    <groupId>com.oracle.ojdbc</groupId>
    <artifactId>ojdbc10</artifactId>
    <version>19.3.0.0</version>
</dependency>

对于Gradle用户,请使用:

implementation 'com.oracle.ojdbc:ojdbc10:19.3.0.0'

用户无需注册。

更新2020-03-02

Oracle现在将驱动程序发布在com.oracle.database组ID下。请参见Anthony Accioly的回答获取更多信息。感谢Anthony。

与JDK6、JDK7和JDK8兼容的Oracle JDBC驱动程序

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0.4</version>
</dependency>

兼容JDK8、JDK9和JDK11的Oracle JDBC驱动程序

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc8</artifactId>
  <version>19.3.0.0</version>
</dependency>

兼容JDK10和JDK11的Oracle JDBC驱动程序

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc10</artifactId>
  <version>19.3.0.0</version>
</dependency>

1
this should be preferred way. - Ashish

53
由于某种原因,我无法使上述任何一种解决方案工作。(仍然不行。)
相反,我将jar包包含在我的项目中(呕吐) ,然后为它创建一个“系统”依赖项,指示jar包的路径。这可能不是正确的做法,但确实有效。并且它消除了团队中其他开发人员(或设置构建服务器的人)将jar包放在他们本地存储库中的需要。
更新:当我运行Hibernate工具时,这个解决方案对我有用。然而,对于构建WAR文件似乎不起作用。它不会将ojdbc6.jar文件包含在目标WAR文件中。
1) 在项目的根目录中创建一个名为“lib”的目录。 2) 将ojdbc6.jar文件复制到那里(无论jar文件叫什么)。 3) 创建一个类似于这样的依赖项:
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc</artifactId>
    <version>14</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/ojdbc6.jar</systemPath> <!-- must match file name -->
</dependency>

虽然难看,但对我有效。

要将文件包含在war文件中,请向您的POM添加以下内容。

<build>
    <finalName>MyAppName</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webResources>
                    <resource>
                        <directory>${basedir}/src/main/java</directory>
                        <targetPath>WEB-INF/classes</targetPath>
                        <includes>
                            <include>**/*.properties</include>
                            <include>**/*.xml</include>
                            <include>**/*.css</include>
                            <include>**/*.html</include>
                        </includes>
                    </resource>
                    <resource>
                        <directory>${basedir}/lib</directory>
                        <targetPath>WEB-INF/lib</targetPath>
                        <includes>
                            <include>**/*.jar</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

8
我喜欢这种解决方案,因为它不需要设置"nexus",在一个项目中通常只有1或2个这样的"jars",并且它简化了其他开发人员对项目的设置,因为他们不必更新本地的".m2环境"(oracle是这种情况的主要候选者)。另外,如果您使用新的oracle jar更新源代码库,则所有开发人员在下次拉取时都将获得它。 - Q Boiler
添加了如何将JAR文件添加到WAR文件的信息。 - ojblass
1
这对我有用 - https://codingcraftsman.wordpress.com/2015/04/20/do-you-want-to-get-ms-sql-jdbc-driver-into-a-maven-war-build/ - Ashley Frieze
1
@Marvo,我尝试了很多解决方案,这个是最好的一个,非常感谢。 - Mahmoud Saleh

31

下载jar包并将其放置在项目的 src/lib 目录中。现在,您可以使用Maven安装程序插件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.3.1</version>
    <executions>
        <execution>
            <id>install-oracle-jdbc</id>
            <goals>
                <goal>install-file</goal>
            </goals>
            <phase>clean</phase>
            <configuration>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc6</artifactId>
                <version>11.2.0</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
                <createChecksum>true</createChecksum>
                <file>${project.basedir}/src/lib/ojdbc6.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

现在,您只需要执行mvn clean一次,Oracle库就会安装在您的本地Maven存储库中。


9
非常有用的替代选择! - Rakesh Waghela

21

Oracle现在在maven.oracle.com上提供了一个Maven仓库,但您需要进行身份验证。

请参见https://blogs.oracle.com/WebLogicServer/entry/weblogic_server_and_the_oracle

根据博客文章中的评论,ojdbc驱动程序应该在以下坐标处可用:

<groupId>com.oracle.weblogic</groupId>
 <artifactId>ojdbc7</artifactId>
 <version>12.1.3-0-0</version>
 <packaging>jar</packaging>

7
这确实可行,但有些棘手。你需要确保获取正确的工件,创建一个Oracle账户,在settings.xml和pom.xml文件中添加一些内容,并在settings.xml中添加该账户的用户名和密码。Oracle需要修复他们的许可问题,因为这仍然很繁琐。 - ggb667
13
要求身份验证才能获取Maven构件听起来很荒谬。 - Rafael Soares - tuelho
3
如果出于某些原因必须使用ojdbc6(即您无法升级到Java 7或更高版本),则需要将artifactId更改为ojdbc6 并且 将版本更改为12.1.2-0-0。 - dcsohl
我正在尝试寻找适用于Java 6的11g版本(11.2.0.4),有人找到了吗? - jpfreire
2
更新:完美解决了!对于旧版本的jdbc驱动程序,你还必须更改groupId:mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:get -DrepoUrl=https://maven.oracle.com -Dartifact=com.oracle.jdbc:ojdbc6:11.2.0.4 - jpfreire

16

尝试使用:

<repositories>
    <!-- Repository for ORACLE ojdbc6. -->
    <repository>
        <id>codelds</id>
        <url>https://code.lds.org/nexus/content/groups/main-repo</url>
    </repository>
</repositories>
<dependencies> 
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
    </dependency>
</dependencies> 

14
除此之外,这是对Oracle许可协议的违规行为。 - Ben L.
3
许可证上有关暴力的条款,但是它能够正常使用。我将其用于教育目的(而非生产目的)。它还包含12c驱动程序。 <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc7</artifactId> <version>12.1.0.2</version> </dependency> - Svetlin Nakov
4
除了许可问题外,你不应该在pom文件中添加未知的仓库。这会带来安全风险,也可能威胁到你的构建。你可以对“末世圣徒耶稣基督教会”的仓库有多少信任?他们提供了什么保证来证明该仓库是可靠、安全和安全的,并且他们不会搞乱它?如果他们被黑客攻击并发布恶意版本的ojdbc驱动程序或你的其他依赖项,会发生什么? - Didier L

13

1. 如何找到包含此工件的存储库(如果有)?

正如DavidS在我回答时评论的那样,我引用的那行已不再存在于我链接的当前(我现在正在写作的时候)OTN许可协议协议中。仅将此答案视为旧版本的工件,如10.2.0.3.0等。

所有Oracle Database JDBC Drivers都是根据OTN许可协议分发的。

如果您阅读OTN许可协议,您会发现这个许可条款:

您不得:
...
- 分发程序,除非与您的应用程序一起;
...

所以这就是为什么您无法在任何公共Maven Repository中找到驱动程序的jar文件,因为它将被单独分发,如果发生这种情况,这将是违反许可证的。

添加依赖项:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.3.0</version>
</dependency>

(或任何后续版本)使Maven仅下载ojdbc14-10.2.0.3.0.pom,并且在该pom中您可以阅读:

...
<licenses>
    <license>
        <name>Oracle Technology Network Development and Distribution License Terms</name>
        <url>http://www.oracle.com/technology/software/htdocs/distlic.html</url>
    </license>
</licenses>
...

这段文字是关于OTN许可证的信息。

2. 如何添加它以便Maven使用?

为了使上述依赖项起作用,我同意victor hugo的建议here手动将jar包安装到本地Maven仓库(.m2目录)中,方法如下:

mvn install:install-file -Dfile={Path_to_your_ojdbc.jar} -DgroupId=com.oracle 
-DartifactId=ojdbc -Dversion=10.2.0.3.0 -Dpackaging=jar

但我想强调的是,上述许可条款不仅限制您无法找到JDBC jar的位置,而且还限制您安装它的位置!
实际上,您的本地Maven存储库必须是私有的而不能共享,因为如果共享,则会成为一种分发,其中仅分发jar文件,即使只是在本地区域网络中的少数人,这也违反了OTN许可协议。
此外,我认为您应该避免将JDBC jar作为单个artifact安装在公司存储库管理器(例如ArtifactoryNexus)中,因为如果安装了它,即使仅向组织内部的人员分发,仍然表示违反了OTN许可协议。

1
值得注意的是,您引用的那行文字已不再出现在您提供的协议中。我认为剩下最接近的一行是:“我们授予您非独占性、不可转让的权利,作为与关联产品(如果有)相互操作的应用程序的一部分和包含在其中,复制和分发未经修改的程序和程序文档,前提是您不向最终用户收取任何额外费用以使用这些程序。”正如您所看到的,这更关注于“付款”而不是重新分发的具体细节。 - DavidS

12

您可以使用Nexus来管理第三方依赖项以及标准Maven存储库中的依赖项。


4
在这种情况下,Nexus将如何帮助?它会从哪里下载构件? - ziggy
4
答案不完整,但我 认为 @Michael Munsey 的意思是创建一个内部/企业知识库来下载。 - Randolph
是的。首先设置Nexus,然后手动下载JAR包并将它们放入到Nexus中,以便后续的Maven构建可以从您的Nexus实例中获取它们。 - Michael Munsey
1
一般来说,像ArtifactoryNexus这样的存储库管理器是一个好的选择,但在Oracle JDBC数据库驱动程序的特定情况下,这不是一个好的选择,因为即使它可以使事情正常工作,但不幸的是,由于此许可证条款违规,它会给您带来麻烦。 - taringamberini

12

截至2020年2月27日,Oracle 宣布已经在Maven中央仓库发布了所有JDBC客户端库,从版本11.2.0.4(例如ojdbc6)到19.3.0(例如ojdbc10),组ID为com.oracle.database

示例:

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc10</artifactId>
  <version>19.3.0.0</version>
</dependency>

5

到目前为止,无法使用Maven仓库。我正在使用Ivy作为依赖管理工具,但也使用Maven2的Ibiblio仓库。这对于Ivy是有效的:

<dependency org="oracle" name="ojdbc14" rev="10.2.0.2" conf="*->default"/>

Maven2的依赖关系可能是这样的:

<dependency> 
    <groupId>oracle</groupId> 
    <artifactId>ojdbc14</artifactId> 
    <version>10.2.0.2</version> 
</dependency>

请注意,我在我的ivy设置中定义了http://download.java.net/maven/2/http://mirrors.ibiblio.org/pub/mirrors/maven/mule/dependencies/maven2/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]作为外部maven2仓库。

1
这是一个很好的答案 - 你可以将这个仓库添加到你的pom.xml中:http://mirrors.ibiblio.org/pub/mirrors/maven/mule/dependencies/maven2,就可以让它工作了。 - Grouchal
7
这可能有效,但是合法吗?正如其他答案所解释的那样,Oracle不允许任何人分发该驱动程序,他们也不提供Maven存储库。如果您使用此解决方案,有时驱动程序可能会在您最不希望它被移除存储库。 - Mr. Lance E Sloan
1
@Grouchal 这个答案可以让事情正常运作,但不幸的是,会因为这个许可证条款违规而给您带来麻烦。 - taringamberini
@Grouchal... 没有 http://maven.ibiblio.org/maven/oraclehttp://maven.ibiblio.org/maven/com.oracle - david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接