- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 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
找不到合适的驱动程序。
最佳答案
根据 an IBM DeveloperWorks forum post ,“jrunscript -classpath 值由一个单独的“脚本”类加载器使用,该类加载器与通常的应用程序类加载器并行,用于解析 importClass() 和 importPackage() 中提到的类”。
并根据this 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.');
}
它删除了一层间接寻址,这可能是也可能不是那杯茶,但它有效(插入了真实的服务器/用户/密码):
$ jrunscript -cp jtds-1.2.5.jar dbtest_realparams.js
yay, got c!
关于java - 为什么 jrunscript 不支持我的类路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3355262/
Jrunscript 有一个'print' 函数。然而它不打印任何关于对象的有用信息。例如: js> var obj = {one:1, two:2} 当评估对象时 Jrunscript 输出: js
我正在尝试使用 Java 6 中包含的 Rhino 从 JavaScript 进行一些 JDBC 访问。但是我无法让 DriverManager 找到我想使用的 Driver。 这两个例子应该是等价的
JDK 有 jrunscript 可执行文件。 JRE 是否具有可以执行的所需 jar,以便不需要完整的 JDK 来使用 jrunscript? 换句话说,我可以通过使用类名调用 java 可执行文件
我是一名优秀的程序员,十分优秀!