dll を使用してデータベース接続を容易にするスイング アプリケーションをデプロイしようとしています (sqljdbc_auth.dll に依存する sqljdbc4 jar を使用)。私の展開戦略は、実行可能な jar ファイルを作成することです。問題は、sqljdbc_auth.dll に依存する関数を、作成した実行可能 jar で動作させることができないことです。
次のいずれかの方法を使用して、Eclipse でプロジェクトを正常に動作させることができます。
- ソース フォルダーでネイティブ ライブラリの場所を指定して、ビルド パス構成で dll を含むフォルダーを参照します。
- dll を C:\Windows\System32 ディレクトリに配置します。
- プロジェクト「-Djava.library.path=path/to/dllfolder」の dll フォルダーの相対パスを参照する次の VM 引数を追加します。
私が試した 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 メソッドを使用して参照しているようです。皮肉なことに、それは私がうまくいかないことの1つです。私は正しいdllを持っていることを知っています。ただし、IDE 環境で他の方法を使用できるためです。dll が実行可能 jar にパッケージ化されているかどうかは気にしません。ただ動作させたいだけです。