1

dll を使用してデータベース接続を容易にするスイング アプリケーションをデプロイしようとしています (sqljdbc_auth.dll に依存する sqljdbc4 jar を使用)。私の展開戦略は、実行可能な jar ファイルを作成することです。問題は、sqljdbc_auth.dll に依存する関数を、作成した実行可能 jar で動作させることができないことです。

次のいずれかの方法を使用して、Eclipse でプロジェクトを正常に動作させることができます。

  1. ソース フォルダーでネイティブ ライブラリの場所を指定して、ビルド パス構成で dll を含むフォルダーを参照します。
  2. dll を C:\Windows\System32 ディレクトリに配置します。
  3. プロジェクト「-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 にパッケージ化されているかどうかは気にしません。ただ動作させたいだけです。

4

1 に答える 1

1

これは、DLLをライブラリに入れることに関係していると思います

(In Eclipse, Properties->Java Build Path->Libraries).

jar をエクスポートするときに、ライブラリ ファイルをフォルダーにエクスポートするオプションもあります。

その後、Jar を逆コンパイルすると、マニフェスト ファイルがあり、その中にライブラリ ファイルの場所へのパスがあることがわかります (エクスポートに基づいて、ライブラリ フォルダが作成され、通常は jarname_lib)。

エクスポートする場合、ANT ファイルとして保存するオプションがあり、これを編集して、ライブラリ ファイルのエクスポート場所を選択したフォルダー名に変更できます。次に、この編集済みの ANT ファイルをビルドに追加して、プロジェクトをビルドするたびにそれが行われるようにします。

(In Eclipse, Properties->Builders->New)
于 2015-03-20T22:57:53.277 に答える