问题背景:在命令行中通过java命令运行程序加载db2数据库驱动正常,打包成jar包以后通过双击jar包执行不正常,双击按钮多次后就出现内存访问异常。
详细描述:运行环境:winxp, jdk1.4.2  
         目录清单:/java/src/xing.chap12.smp12_1.FirstSwing.java
                  /java/src/xing.chap12.smp12_1.FirstSwing.class
                  /java/bin/COM  为db2驱动程序。
          在目录/java/bin下执行jar.exe cvfm  Myjar.jar MANIFEST.MF  ./  打包成jar文件。 a. 双击Myjar.jar执行,点击'加载'按钮多次后出现内存引用错误,程序直接退出。
b. 通过java  -jar Myjar.jar  执行,观察控制台输出.截取的部分内容如下:
         C:\java\release\test>java -jar Myjar.jar
        java.lang.NoClassDefFoundError: com/ibm/db2/jcc/SQLJPreparedStatement
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
        at COM.ibm.db2.jdbc.app.DB2Driver.SQLAllocEnv(Native Method)
        at COM.ibm.db2.jdbc.app.DB2Driver.<init>(Unknown Source)
        at COM.ibm.db2.jdbc.app.DB2Driver.<clinit>(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:141)
        at xing.chap12.smp12_1.TestDb2.<clinit>(Unknown Source)
c. 通过java xing.chap12.smp12_1.FirstSwing输出正常,db2驱动程序正常加载.
d.      如果改用jdk1.5.0运行上面生成的jar 文件,则会程序退出,生成hs_err_pid4216.log错误日志文件。
日志部分内容如下:
                  #
           # An unexpected error has been detected by HotSpot Virtual Machine:
           #
           #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6c9759, pid=4248, tid=3860
           #
           # Java VM: Java HotSpot(TM) Client VM (1.5.0_04-b05 mixed mode, sharing)
           # Problematic frame:
           # V  [jvm.dll+0x89759]
           #
           
           ---------------  T H R E A D  ---------------
           
           Current thread (0x0084d030):  JavaThread "AWT-EventQueue-0" [_thread_in_vm, id=3860]
           
           siginfo: ExceptionCode=0xc0000005, reading address 0x00000000
           
           Registers:
           EAX=0x00000000, EBX=0x00000000, ECX=0x0084a7d0, EDX=0x009b1ca8
           ESP=0x037fee48, EBP=0x037fee78, ESI=0x0084d030, EDI=0x009b1ca0
           EIP=0x6d6c9759, EFLAGS=0x00010202
           
           Top of Stack: (sp=0x037fee48)
           0x037fee48:   0084d0ec 0084d0ec 26cbe358 0084d0ec
           0x037fee58:   0084d0ec 6d6806a4 6d64a9ab 0084d030
           0x037fee68:   037fee98 6d6c5fe7 0084d030 009b1ca0
           0x037fee78:   037fee98 03d2a647 0084d0ec 00000000
           0x037fee88:   03d330c8 009b1ca4 0084d030 26cbe358
           0x037fee98:   037feeb8 03d239b0 0084d0ec 00000000
           0x037feea8:   00000000 00000000 0084d030 26cbe358
           0x037feeb8:   037feee8 00ab826f 0084d0ec 037feefc 
           
           Instructions: (pc=0x6d6c9759)
           0x6d6c9749:   a9 00 00 00 39 5d 14 0f 84 a0 00 00 00 8b 45 0c
           0x6d6c9759:   ff 30 e8 2a 97 ff ff 59 50 56 8d 4d 08 e8 cf c6 
           
           
           Stack: [0x037c0000,0x03800000),  sp=0x037fee48,  free space=251k
           Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
           V  [jvm.dll+0x89759]
           C  [db2jdbc.dll+0xa647]
           C  [db2jdbc.dll+0x39b0]
           j  COM.ibm.db2.jdbc.app.DB2Driver.SQLAllocEnv([I)I+0
           j  COM.ibm.db2.jdbc.app.DB2Driver.<init>()V+678
           j  COM.ibm.db2.jdbc.app.DB2Driver.<clinit>()V+27
           v  ~StubRoutines::call_stub
           V  [jvm.dll+0x82696]
           V  [jvm.dll+0xd6fd9]
           V  [jvm.dll+0x82567]
           V  [jvm.dll+0x7576b]
           V  [jvm.dll+0x7467e]
           V  [jvm.dll+0x9fce0]
           V  [jvm.dll+0x98ff8]
           C  [java.dll+0x13d8]
           j  java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+0
           j  java.lang.Class.forName(Ljava/lang/String;)Ljava/lang/Class;+5
           j  xing.tools.sinotool.SjjhTool.<clinit>()V+3
           v  ~StubRoutines::call_stub
           V  [jvm.dll+0x82696]
           V  [jvm.dll+0xd6fd9]
           V  [jvm.dll+0x82567]
           V  [jvm.dll+0x7576b]
           V  [jvm.dll+0x7467e]
程序FirstSwing.java如下:package xing.chap12.smp12_1;import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.sql.*;
import java.io.*;class TestDb2{
  static{     
    try{     
     System.out.println("Class1");
      Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();  
      System.out.println("Class2");  
      Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
    }catch(Exception   eReg){     
            eReg.printStackTrace();     
            System.out.println("Class_err");
    }         
  }
  private Connection conn = null;
private Statement   stmt = null;
public int getCon(){
   try{
     conn = DriverManager.getConnection("jdbc:db2:zsk", "sino_zsk", "123456");
     return 1;
    }catch(Exception eConnect){
                 System.out.println("Connect database fail!  Please check the param: " +  eConnect.toString());
      return 0;
    }
}
}public class FirstSwing extends JFrame implements ActionListener {
  private JLabel jLableWelcome ;
  private JPanel jp = new JPanel();
  private JButton jButtonSelectSqlFile = new JButton("加载");
  public FirstSwing(){
   //this.setLayout(null);
   jLableWelcome = new JLabel();
   jLableWelcome.setText("Swing编程");
   jLableWelcome.setBounds(40,30,450,30);
   jp.add(jLableWelcome);
   jp.add(jButtonSelectSqlFile);
   jButtonSelectSqlFile.addActionListener(this);
   this.getContentPane().add(jp);
   this.setTitle("第一个Swing程序");
   this.setBounds(330,250,500,150);
   this.setVisible(true);
   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  
  public void actionPerformed(ActionEvent e){
   TestDb2 tdb2 = new TestDb2();
   TestDb2 tdb2_2 = new TestDb2();
  }
  
  public static void main(String[] args) throws Exception{
    new FirstSwing();
  }
}望各位帮忙分析一下原因,谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xing_1306】截止到2008-07-22 17:22:10的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html