【问题标题】:What is classpath for Groovy Console / jdbc driver prblem?Groovy Console / jdbc 驱动程序问题的类路径是什么?
【发布时间】:2015-09-10 06:39:02
【问题描述】:

这样的数据库代码在Java环境下是可以的(没有绑定值'c'),但是在Groovy控制台不能正常使用jdbc,有异常

java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=

Driver 类以脚本而闻名(加载时没有 null 等)但可能未在 Drivermanager 中注册?

代码(我尝试使用和不使用Class.forname()

import groovy.sql.Sql
import groovy.sql.DataSet

c =   Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')

def db = [url:'jdbc:sqlserver://localhost;databaseName=... ,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
 def sql = Sql.newInstance(db )

编辑: 我已经检查过的内容:

  1. 新启动的 Groovy 控制台在类路径上没有 sqljdbc4.jar。

第 4 行 Class.forName() 上的自然异常 java.lang.ClassNotFoundException,或者如果第 4 行注释和参数 db 带有驱动程序名称,则第 7 行上的异常 Sql.newInstance(db )

它的逻辑,找不到驱动类等等......

1a。如果 db 参数带有 3 个参数(没有驱动程序),我假设它的合法(并且在其他情况下工作)异常更改为第 7 行 SQLException: No suitable driver Sql.newInstance(db )

这也是合乎逻辑的,DriverManager 不知道如何解析密钥 jdbc:sqlserver 。 Driver 没有注册,DriverManager 不知道类实现了什么。

2。 当我将 jar 添加到控制台类路径(脚本/将 jar(s)添加到类路径)时,事情发生了一些变化。不再有 ClassNotFoundException 和变量 c 具有非空值(驱动程序类),但 SQLException: No suitable driver 继续。

我对 JDBC 哲学的理解:(现代)JAR 驱动程序使用文件META-INF/services/java.sql.DriverDriverManager 闻名。 因此,在正确的情况下,不需要第 4 个参数(驱动程序类名称),因为它是自动发现的。 如果我错了,请纠正我的理解。

我在这个意义上使用了“活动”一词(“非活动”表示类存在并已加载,但可以用作 jdbc 驱动程序)。

我的最大密码是:

import groovy.sql.Sql
import groovy.sql.DataSet
import java.sql.DriverManager;
import java.util.ServiceLoader;


c =   Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')
DriverManager.getDrivers()
ServiceLoader.load(java.sql.Driver.class)
def db = [url:'jdbc:sqlserver://localhost;...,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
def sql = Sql.newInstance(db )

但还是no suitable driver异常

编辑2: 我用这样的代码枚举事物(在 newInstance() 之前):

StringBuilder sb = new StringBuilder();
        String grVersion = "brak";

        Enumeration<Driver> dri = DriverManager.getDrivers();

        for (Enumeration<Driver> e = dri; e.hasMoreElements();) {
            Driver e1 = e.nextElement();
            sb.append(e1.getClass().getName()).append(' ');
            sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
        }


        // get LOADED drivers niesetty

        ServiceLoader<java.sql.Driver> codecSetLoader = ServiceLoader.load(java.sql.Driver.class);
        for (Driver e1 : codecSetLoader) {
            sb.append(e1.getClass().getName()).append('!');
            sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
            sb.append("# ");
        }

得到

com.mysql.jdbc.Driver 5.1com.mysql.fabric.jdbc.FabricMySQLDriver 5.1com.mysql.jdbc.Driver!5.1# com.mysql.fabric.jdbc.FabricMySQLDriver!5.1# com.microsoft.sqlserver.jdbc.SQLServerDriver!4.0#  
Exception thrown

java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=....

    at ConsoleScript11.run(ConsoleScript11:32)

我执行的(基本)代码是 Tomcat 环境仍然可以正常工作。怎么了?

【问题讨论】:

  • 驱动 jar 是否在类路径中?
  • 是的,存在(加载时不为空)但“未激活”
  • 我不知道这是什么意思 :-(
  • 如果您确实在 Groovy 控制台的类路径中添加了带有 jdbc 驱动程序的 jar,那么它应该可以工作。我也不是指这里的“未激活”是什么意思
  • 我更新了问题

标签: groovy groovy-console


【解决方案1】:

作者的回答:

当驱动程序 JAR 从菜单中添加“动态”时(如被覆盖)是可见的,但不能作为 JDBC 工作。

当驱动 JAR 被放入 ...console\lib 目录时(在 Groovy 的其他 JAR'a 之间)一切正常。

这种程度的调查对我来说已经足够了,也许有人试图在菜单中找到错误。我可以接受(绿色)我自己的答案吗?

【讨论】:

    【解决方案2】:

    今天的解决方案是在脚本开头添加以下内容。使用 groovy 2.5。

    @Grab('com.microsoft.sqlserver:sqljdbc4:4.0')
    @GrabConfig(systemClassLoader=true)
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2016-07-21
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多