我正在尝试部署一个使用 dll 来促进数据库连接的 swing 应用程序(使用依赖于 sqljdbc_auth.dll 的 sqljdbc4 jar)。我的部署策略是创建一个可执行的 jar 文件。问题是我无法让依赖 sqljdbc_auth.dll 的函数在我创建的可执行 jar 中工作。
我可以使用以下任何一种方法使项目在 Eclipse 中正常工作:
- 通过在 Source 文件夹上指定 Native 库位置,在构建路径配置中引用包含 dll 的文件夹
- 将 dll 放在 C:\Windows\System32 目录下
- 添加以下 VM 参数,引用我的项目“-Djava.library.path=path/to/dllfolder”中的 dll 文件夹的相对路径
我尝试的第 4 种方法是通过以下行直接在代码中加载 dll。System.load("C:/Users/Me/Desktop/sqljdbc_auth.dll");
我使用这种方法没有成功,并收到以下错误。
Mar 20, 2015 4:18:44 PM com.microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNING: Failed to load the sqljdbc_auth.dll cause : no sqljdbc_auth in java.library.path
但是,该错误并非直接来自加载库的代码行,它似乎是在 sqljdbc 库尝试加载 dll 以用于建立连接时出现的。
无论哪种方式,当我通过 eclipse 的导出功能将应用程序部署为可执行 jar 文件时,上述任何方法都无法正常工作。我唯一能得到的是前面提到的错误消息。
以下示例应用程序产生相同的结果。
public class TestApp {
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
JFrame mainFrame = new JFrame();
mainFrame.setSize(300,300);
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
try{
//System.load("C:/Users/Me/Desktop/sqljdbc_auth.dll");
String serverName = "local";
String databaseName = "test_database";
String connString = "jdbc:sqlserver://" + serverName + "; databaseName=" + databaseName + ";integratedSecurity=true";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(connString);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select distinct name from test_table");
rs.next();
JOptionPane.showMessageDialog(null, "From db: " + rs.getString(1), "Test", JOptionPane.INFORMATION_MESSAGE);
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e.getMessage(), "Test", JOptionPane.INFORMATION_MESSAGE);
} catch (ClassNotFoundException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e.getMessage(), "Test", JOptionPane.INFORMATION_MESSAGE);
} catch (Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null, e.getMessage(), "Test", JOptionPane.INFORMATION_MESSAGE);
}
}
});
}
}
我已经阅读了大量关于使用带有可执行 jar 的 dll 的帖子,它们似乎都使用了这个 System.load 方法。具有讽刺意味的是,这是我无法工作的一件事。我知道我有正确的 dll;但是,因为我可以获得其他方法在 IDE 环境中工作。我不在乎 dll 是否与可执行 jar 打包在一起,我只希望它工作!