繁体   English   中英

为什么jrunscript不尊重我的课程?

[英]Why doesn't jrunscript honor my classpath?

我正在尝试使用Java 6中包含的Rhino从JavaScript进行一些JDBC访问。但我不能让DriverManager找到我想要使用的Driver

这两个例子应该是等价的:

Java的:

public class DbTest {
    public static void main(String[] argv) {
        java.sql.Connection c = null;
        try {
            java.lang.Class.forName("net.sourceforge.jtds.jdbc.Driver");
            c = java.sql.DriverManager.getConnection(
                "jdbc:jtds:sqlserver://myserver/mydb", "user", "password");
        }
        catch (Exception e) {
            c = null;
            System.out.println(e);
        };

        if(c != null) {
           System.out.println("yay, got c!");
           try {
               c.close();
           }
           catch(Exception e) {}
        } else {
           System.out.println("awww.");
        }
    }
}

JavaScript的:

importPackage(Packages.net.sourceforge.jtds.jdbc);
java.lang.Class.forName('net.sourceforge.jtds.jdbc.Driver');
var c = null;
try {
    c = java.sql.DriverManager.getConnection(
        'jdbc:jtds:sqlserver://myserver/mydb', 'user', 'password');
}
catch (e) {
    c = null;
    println(e);
};

if(c) {
   println('yay, got c!');
   c.close();
} else {
   println('awww.');
}

...但是当我运行它们时,我得到了这样的行为:

Java的:

> java -cp .;jtds-1.2.5.jar DbTest
java.sql.SQLException: Unknown server host name 'myserver'.
awww.

这很好,它设法加载驱动程序并尝试解析服务器。

JavaScript的:

> jrunscript -cp .;jtds-1.2.5.jar dbtest.js
script error in file dbtest.js :
sun.org.mozilla.javascript.internal.WrappedException: 
Wrapped java.lang.ClassNotFoundException: 
net.sourceforge.jtds.jdbc.Driver (dbtest.js#2) in dbtest.js at line number 2

为什么不找到班级? 我已尝试使用和不使用importPackage()importClass() ,包含和不包含Packages前缀。 如果我注释掉forName ,那么DriverManager找不到合适的驱动程序。

根据IBM DeveloperWorks论坛帖子 ,“ jrunscript -classpath值由一个单独的”脚本“类加载器使用,该类加载器与通常的应用程序类加载器相似,用于解析在importClass()和importPackage()中提到的类

根据这个SO答案 ,“ ... DriverManager使用直接调用者的类加载器实例”执行”任务

因此,除非您将驱动程序jar放入bootclasspath或找到修改jrunscript (和Ant <script /> )如何设置脚本环境的系统类加载器的方法,否则使其工作的唯一方法似乎是跳过DriverManager完全:

var c = null;
try {
    var p = new java.util.Properties();
    p.setProperty('user', 'user');
    p.setProperty('password', 'password');
    c = (new net.sourceforge.jtds.jdbc.Driver()).connect(
             'jdbc:jtds:sqlserver://myserver/mydb', p);
}
catch (e) {
    c = null;
    println(e);
};

if(c) {
   println('yay, got c!');
   c.close();
} else {
   println('awww.');
}

它删除了一层间接,它可能是也可能不是一杯茶,但它可以工作(插入真实的服务器/用户/密码):

$ jrunscript -cp jtds-1.2.5.jar dbtest_realparams.js 
yay, got c!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM