Class.forName在Java RMI调用中不起作用

时间:2009-11-27 04:00:20

标签: java rmi classloader

Java RMI对以下代码行有什么影响?

的Class.forName( “com.microsoft.sqlserver.jdbc.SQLServerDriver”);

它在RMI调用中不适合我。我是java和RMI的新手,所以请详细说明你的答案。

编辑:

//String connect to SQL server
String url = "jdbc:sqlserver://" + strServerIPAddress + ":1433" + ";DatabaseName=" + strDatabaseName;

try {

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

} 
catch (java.lang.ClassNotFoundException e) 

{ 
    System.out.println(e.getCause().toString());
    return false;
}

我已粘贴代码。你能告诉我如何获得完整的堆栈跟踪吗?

这是我用来运行我的代码的批处理文件

%我在我的源代码目录

javac -d classes -cp classes *.java
rmic -classpath classes -d classes myrmi.DummyImpl myrmi.BookImpl    
start rmiregistry -J-Dsun.rmi.loader.logLevel=VERBOSE

start java -cp classes -Djava.rmi.server.codebase=file:///C:\NetBeansProjects\MyProject\src\myrmi\classes\ -Djava.security.policy=java.policy 

myrmi.Server SEB 
start java -cp classes -Dsun.rmi.loader.logLevel=VERBOSE  -Djava.security.policy=java.policy myrmi.Client 

3 个答案:

答案 0 :(得分:2)

在运行远程实例的VM的类路径上是否提供了带有com.microsoft.sqlserver.jdbc.SQLServerDriver的JAR文件?

-cp类只会获取其下的.class文件,因此如果SQLDriver位于JAR或ZIP文件中(可能位于其中),则无法找到它。您需要执行“-cp classes;< path to driver>”

答案 1 :(得分:0)

使用Class.forName()时,传递给方法的字符串必须包含类路径中的类。

答案 2 :(得分:0)

可能的原因是您无权加载驱动程序或连接到远程数据库。粗略地说,堆栈中的所有帧以及创建当前线程的点必须具有所需的权限(java.security.AccessController.doPrivileged可以用来玩这个)。可以通过系统属性设置一些调试选项来显示安全检查(请参阅AccessController中或附近的源。)

我不确定您在哪里尝试建立连接。如果是来自RMI动态加载的代码,那就太奇怪了。

您可以使用exc.printStackTrace()从异常中获取完整堆栈跟踪。