4

Java 6に含まれているRhinoを使用してJavaScriptからJDBCアクセスを実行しようとしていますが、使用したいDriverManager検索を行うことができません。Driver

これらの2つの例は同等である必要があります。

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()PackagesforNameDriverManager

4

1 に答える 1

3

IBM DeveloperWorks フォーラムの投稿によると、「jrunscript -classpath 値は、通常のアプリケーション クラスローダーと同等の別の「スクリプト」クラスローダーによって使用され、importClass() および importPackage() で言及されたクラスを解決するために使用されます」。

そして、この SO answerによると、「... 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.');
}

これにより、1 杯のお茶である場合もそうでない場合もある間接的なレイヤーが 1 つ削除されますが、動作します (実サーバー/ユーザー/パスワードが挿入されている場合)。

$ jrunscript -cp jtds-1.2.5.jar dbtest_realparams.js 
yay, got c!
于 2010-07-29T09:47:03.923 に答える