2010-07-28 27 views
4

我正在尝试使用Java 6中包含的Rhino来执行一些JDBC访问。但是我无法让DriverManager找到我想要使用的Driver为什么jrunscript不尊重我的类路径?

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

的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找不到合适的驱动程序。

+0

试了一下现在在Linux中,完全相同行为。还尝试运行'java -cp blabla com.sun.tools.script.shell.Main dbtest.js',没有区别。 – clacke 2010-07-28 21:02:33

+0

怀疑这是一个安全问题,并且脚本引擎使用自己的类加载器运行。所以问题是可以修改的地方。 试过运行一个Ant'

相关问题