J'essaie de faire un peu d'accès JDBC à partir de JavaScript en utilisant le Rhino inclus dans Java 6. Mais je ne peux pas faire le DriverManager
trouver le Driver
que je veux utiliser.Pourquoi jrunscript n'honore-t-il pas mon chemin de classe?
Ces deux exemples devraient être équivalents:
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.');
}
... mais quand je les cours, je reçois ce comportement:
Java:
> java -cp .;jtds-1.2.5.jar DbTest
java.sql.SQLException: Unknown server host name 'myserver'.
awww.
C'est génial, il a réussi à charger le pilote et a essayé de résoudre le serveur.
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
Pourquoi ne pas trouver la classe? J'ai essayé avec et sans importPackage()
et importClass()
, avec et sans le préfixe Packages
. Si je commente forName
, puis DriverManager
ne trouve pas un pilote approprié.
essayé sous Linux maintenant, exactement la même comportement. Également essayé d'exécuter 'java -cp blabla com.sun.tools.script.shell.Main dbtest.js', pas de différence. – clacke
Suspecter qu'il s'agit d'un problème de sécurité et que le moteur de script s'exécute à l'aide de son propre chargeur de classe. La question est donc de savoir où cela peut être modifié. Essayé d'exécuter un Ant '', qui a un attribut classpath, évidemment pour le bénéfice du script. Aussi ne fonctionne pas. – clacke
'java -cp $ JAVA_HOME/lib/tools.jar -Xbootclasspath:" $ JAVA_HOME/jre/lib/rt.jar: $ JAVA_HOME/jre/lib/resources.jar: jtds-1.2.5.jar "com.sun .tools.script.shell.Main dbtest.js' fonctionne. Mais je veux savoir pourquoi ni 'jrunscript' ni' 'semblent utiliser le classpath normal, et lequel ils utilisent. – clacke