遇到一个很诡异的问题。这几天突然来了兴趣,写了个身份证号码验证的小程序。在Eclipse下的Run as运行正常(能够成功连接数据库和显示程序图标)。可是导出成.jar可执行文件后,运行却不正常了(不能连接到数据库和显示程序图标)。请大家帮忙看看,谢谢了~(应该是项目的相对路径的问题。我把生成的.jar放到IdCardValidation\下就又正常了,但我jar里已经有包含相关的资源文件了,搞的郁闷了~) PS:程序用到了一个access的mdb数据文件和一个程序图标文件。 项目的结构如下: IdCardValidation 
    src 
      edu.mdqy195905(包) 
          IdCardValidation.java(主类) 
          UtilConfig.java(数据库工具类,用于获取数据库配置信息) 
          UtilConnection.java(数据库连接类) 
          DB.properties(数据库配置信息,这里写了数据库连接字符串等相关信息)  
    DB 
      information.mdb(身份证地区代码) 
    image 
      Ninja.JPG(图标文件) 我已经把该项目打包上传到下面的链接里了,压缩包里含有一个.jar可执行文件(机器上有JRE双击可以执行)和项目文件。请大家指正,谢谢~
http://download.csdn.net/source/1373322懒得下载程序的可以看下面代码:DB.propertites内容conn_type= 
conn_url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=DB\\information.mdb 
conn_user= 
conn_pwd= 
conn_driver=sun.jdbc.odbc.JdbcOdbcDriverUtilConfig.java内容package edu.mdqy195905;
import java.io.IOException;
import java.util.Properties;public class UtilConfig {    private static Properties prop=new Properties();
    static
    {
        try
        {
            prop.load(UtilConfig.class.getResourceAsStream("DB.properties"));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    public static String CONNECTION_TYPE=prop.getProperty("conn_type");
    public static String CONNECTION_URL=prop.getProperty("conn_url");
    public static String CONNECTION_USER=prop.getProperty("conn_user");
    public static String CONNECTION_PWD=prop.getProperty("conn_pwd");
    public static String CONNECTION_DRIVER=prop.getProperty("conn_driver");
}
UtilConnection.java内容package edu.mdqy195905;import java.sql.Connection;
import java.sql.DriverManager;public class UtilConnection {    public static Connection getConnection()
    {
        Connection conn=null;
        try
        {
            Class.forName(UtilConfig.CONNECTION_DRIVER);
            conn=DriverManager.getConnection(UtilConfig.CONNECTION_URL,UtilConfig.CONNECTION_USER,UtilConfig.CONNECTION_PWD);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        if(conn==null)
        {
            System.out.println("no get connection! throws Exception");
        }
        return conn;
    }
}
IdCardValidation.java内容package edu.mdqy195905;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;@SuppressWarnings("serial")
public class IdCardValidation extends JFrame implements ActionListener{    private Connection con=null;
    private JLabel label;
    private JTextField idnumber;
    private JButton search;
    private int[] power={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    private int[] check={1,0,10,9,8,7,6,5,4,3,2};
    
    public IdCardValidation()
    {
        init();
    }
    
    public void actionPerformed(ActionEvent e) {    
        verification();
    }
    
    private void init()
    {
        label=new JLabel("身份证号码:");
        idnumber=new JTextField(12);
        idnumber.setToolTipText("请在这里输入18位身份证号码");
        search=new JButton("查询");
        search.setToolTipText("点击查询");
        search.addActionListener(this);
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(label);
        getContentPane().add(idnumber);
        getContentPane().add(search);
        setSize(325,75);
        setResizable(false);
        setTitle("身份证验证");
        setIconImage(new ImageIcon("image\\Ninja.JPG").getImage());
        setVisible(true);
    }
    
    private void verification()
    {
        if(idnumber.getText().trim().length()!=18)
        {
            JOptionPane.showMessageDialog(this, "请输入正确的身份证号!", "警告", JOptionPane.ERROR_MESSAGE);
            idnumber.setText("");
            idnumber.requestFocus();
            return;
        }
        con=UtilConnection.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
            st=con.createStatement();
            rs=st.executeQuery("select DQ from idcard where BM="+idnumber.getText().substring(0,6));
            if(rs.next())
            {
                if(checkCode(idnumber.getText()))
                {
                    JOptionPane.showMessageDialog(this, "来自:\n"+rs.getString(1), "查询结果", JOptionPane.INFORMATION_MESSAGE);
                    idnumber.setText("");
                    idnumber.requestFocus();
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "无效的身份证号", "出错了", JOptionPane.INFORMATION_MESSAGE);
                    idnumber.requestFocus();
                }
            }
            else
            {
                JOptionPane.showMessageDialog(this, "无效的身份证号", "出错了", JOptionPane.INFORMATION_MESSAGE);
                idnumber.requestFocus();
            }
            
        } catch (SQLException e1) {
            JOptionPane.showMessageDialog(this, "请输入正确的身份证号!", "警告", JOptionPane.ERROR_MESSAGE);
            idnumber.setText("");
            idnumber.requestFocus();
        }
        finally
        {
            rs=null;
            st=null;
            con=null;
        }
    }
    
    private boolean checkCode(String idCardNumber)
    {
        int sum=0;
        for(int i=0;i<idCardNumber.length()-1;i++)
            sum+=(Integer.parseInt(idCardNumber.charAt(i)+"")*power[i]);
        int remainder=sum%11;
        if(Integer.parseInt(idCardNumber.charAt(idCardNumber.length()-1)+"")==check[remainder])
            return true;
        else
            return false;
    }
    
    public static void main(String[] args) {
        new IdCardValidation().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

解决方案 »

  1.   

     sunyujia 博客上有个 获取 jar 文件路径的解说,你可以去找找
    blog.csdn.net/sunyujia这家伙好久没上来了....
      

  2.   

    应该是DB.propertites文件的路径问题。
    楼主使用读取配置文件的方法,应该是从Java的类路径里面读取DB.propertites文件。
    部署执行的时候,DB.propertites文件可能没有打到Jar包里。
    解决这类问题,可以从两方面入手。
    一是,更改读取配置文件的方式。
    二是,将DB.propertites文件的所在路径,添加到类路径当中。
    //方法一:只需要将
    prop.load(UtilConfig.class.getResourceAsStream("DB.properties"));
    //更改为
    prop.load(new File("DB.properties"));
    //应该可以解决问题。如还不能,可以尝试
    prop.load(new File(System.getProperty("user.dir")+"\\DB.properties"));//方法二:比较变态,不推荐使用。(可以通过设置环境变量等方式添加类路径)