0

我想在我的 Nashorn javascript 中加载一个 3rd 方类,它作为一个可兴奋的 shell 脚本运行。我检查了下面的线程,但没有得到任何提示。

如何在 Nashorn 中的 javascript 中 访问我的类中的方法 如何在 Nashorn 中的 javascript 中访问我的类中的方法

这是我的脚本

#!/usr/java/default/bin/jjs -scripting

var db_url = "jdbc:sqlserver://1.2.3.4:1433;databaseName=email;user=email;password=email;";
var user = "email";
var pass = "email";

var conn = java.sql.DriverManager.getConnection(db_url,user,pass);
var stmt = conn.prepareStatement("select version()");
var rs = stmt.executeQuery();

while(rs.next()){
    var name = rs.getString(1);
    println("version=" + name);
}
rs.close();
stmt.close();
conn.close();

运行时出现此错误

线程“主”java.lang.RuntimeException 中的异常:java.sql.SQLException:找不到适合 jdbc 的驱动程序:sqlserver://1.2.3.4:1433;databaseName=email;user=email;password=email; 在 jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:382) 在 jdk.nashorn.tools.Shell.apply(Shell.java:381) 在 jdk.nashorn.tools.Shell.runScripts(Shell.java :310) 在 jdk.nashorn.tools.Shell.run(Shell.java:166) 在 jdk.nashorn.tools.Shell.main(Shell.java:130) 在 jdk.nashorn.tools.Shell.main(Shell. java:109) 原因:java.sql.SQLException: 找不到适合 jdbc:sqlserver://12.3.4:1433;databaseName=email;user=email;password=email; 的驱动程序 在 java.sql.DriverManager.getConnection(DriverManager.java:689) 在 java.sql.DriverManager.getConnection(DriverManager.

4

1 回答 1

3

除了在类路径中包含 JDBC 驱动程序 jar 之外,您还必须加载驱动程序类,以便它将向 JDBC 注册。

#!/usr/bin/env jjs -scripting -J-Djava.class.path=/usr/local/java/sqljdbc-1.1.1320.0.jar

// jjs requires -- to start passing arguments to the script in Java 8u40b12

if ($ARG.length < 4) {
  print("Usage: ${__FILE__} -- server database user password");
  exit(1);
}
var server = $ARG[0],
    database = $ARG[1],
    user = $ARG[2],
    pass = $ARG[3];

var db_url = "jdbc:sqlserver://${server}:1433;databaseName=${database};";

java.lang.Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')

var conn = java.sql.DriverManager.getConnection(db_url,user,pass);
var stmt = conn.prepareStatement("select version()");
var rs = stmt.executeQuery();

while(rs.next()){
    var name = rs.getString(1);
    println("version=" + name);
}
rs.close();
stmt.close();
conn.close();

classForName(String)缺少的是在尝试创建连接之前的调用。

于 2014-11-12T19:58:08.670 回答