jar打包后 ClassNotFound?(100分)

  • 主题发起人 主题发起人 squell
  • 开始时间 开始时间
S

squell

Unregistered / Unconfirmed
GUEST, unregistred user!
我在使用SQLServer2000 Driver for JDBC时,编译运行一切正常。但打包成jar后,
运行到 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")时
却总是报找不到类:
java.lang.ClassNotFoundException:
com.microsoft.jdbc.sqlserver.SQLServerDriver。
请问应该如何打包才能正常运行?谢谢!
 
请问你是如何使用的谢谢。
 
我的源代码如下:
当不打包时,用java MyClass运行一切正常。
但做成jar后,使用java -jar MyJar.jar时,其他按钮功能均正常
但点击按钮访问数据库时,就会出错了

private void btnReadDBClicked(){
//load the driver
try{
addMsgln("Getting DB Driver...");
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String lsourceUrl= new String("jdbc:microsoft:sqlserver://dbname:1433");
addMsgln("Start Connecting...");
Connection ldbConn= DriverManager.getConnection(lsourceUrl,"username","password");
addMsgln("Changing to DB ...");
ldbConn.setCatalog("MyDB");
String lSQL="select * from TestTable";
ResultSet lrs= ldbConn
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)
.executeQuery(lSQL.toString());
addMsgln(String.valueOf(lrs.getRow()));
lrs.beforeFirst();
while (lrs.next()){
addMsgln(lrs.getString("Caption"));
}//while
}catch(ClassNotFoundException cnfe){
addMsgln("Error: "+cnfe);
}catch(SQLException sqle){
addMsgln("Error: "+sqle);
}//try catch
}
 
你的jdbc driver的包放在你的classpath 里面了吗?在java -jar的时候,显式的加上-classpath <path_to_jdbc_driver>。
 
java -cp .;D:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/mssqlserver.jar;D:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msbase.jar;D:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msutil.jar -jar Myjar.jar
会报错,java在window(我的是WindowXP)的dos下似乎不支持长路径名?
Exception in thread "main" java.lang.NoClassDefFoundError: Files/Microsoft
 
不是不支持长文件名,而是cmd是依靠空格来分割参数的。你有两个选择,一是把有空格的文件路径两端
加上双引号。
比如:
"D:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/mssqlserver.jar"
另一个是把这个jar文件copy到一个较短名字的目录中。
 
但我把三个sqlserver的jar copy到了D:/Temp
--------〉
java -cp .;D:/temp/mssqlserver.jar;D:/temp/msbase.jar;D:/temp/msutil.jar MyClass.class
《------------运行正常
-------〉myClass打包成Myjar后
java -cp .;D:/temp/mssqlserver.jar;D:/temp/msbase.jar;D:/temp/msutil.jar -jar Myjar.jar
〈———— 运行不正常(报错同前,ClassNoFound)
因此我怀疑是否使用jar打包后,classpath就失效了,sqlserver的jar就无法正常使用了?
 
这个问题我自己解决了,斑竹能不能帮帮忙,把这个问题取消?
 
唉,你就不能把分给了曹晓钢吗?人家也辛苦了半天......
不过我觉得曹晓钢说得应该没有错啊,你是怎么解决的?
我对你下面这句话很感兴趣,因为应该不会是这样的,
[red]因此我怀疑是否使用jar打包后,classpath就失效了,
sqlserver的jar就无法正常使用了?[/red]
 
请看:
运行正常: javaw
-cp "D:/lib/msbase.jar";"D:/lib/mssqlserver.jar";
"D:/lib/msutil.jar";"Myjar.jar"
DbTry
运行出错: javaw
-cp "D:/lib/msbase.jar";"D:/lib/mssqlserver.jar";
"D:/lib/msutil.jar"
-jar Myjar.jar
由此可发现直接通过.jar运行,classpath似乎就无效了。后来我找到了解决方法:
就是必须在MANIFEST.MF里指定
Class-Path: msbase.jar mssqlserver.jar msutil.jar
但是问题还未完全解决,还需要辅助以下方法两种方法之一:
1。 直接将三个sqlserver的jar拷贝到myjar.jar同一个目录下
2。 利用Installed Extensions机制,将三个jar拷贝到jre/lib/ext下即可。
实际上我最初的目的是,用鼠标直接点击myjar.jar就可以运行,
现在发现,如果使用鼠标双击运行的话,
只有1方法可以正常运行,可是当我有多个jar程序(不同目录下)时
似乎就很麻烦了,要拷贝好多副本,目前我也正在寻求解决方法。
 
好东西,正好解决了我的问题
 
to oldppp:
你的问题解决了,我的怎么没有人解决阿?
我的jar如果不把sqlserver的三个jar拷贝到同一目录下,
双击就是无法正常运行。
请问哪位高手能回答
直接双击jar运行 与 java -jar Myjar.jar 工作机制有什么不同吗?
 
java Myjar.jar 和 java -jar Myjar.jar的区别吧
 
直接双击应该是调用的 javaw Myjar.jar
 
to DragonPC_???:
我试过了。使用javaw Myjar.jar,报错说:“Could not find the main class!”
而使用 javaw -jar Myjar.jar就可以。
可见你的说法好像不成立!
 
后退
顶部