簡體   English   中英

依賴於dll的可執行Jar

[英]Executable Jar with Dependency on dll

我正在嘗試部署一個使用dll來便利數據庫連接的swing應用程序(使用依賴於sqljdbc_auth.dll的sqljdbc4 jar)。 我的部署策略是創建一個可執行的jar文件。 問題是我無法獲得依賴sqljdbc_auth.dll的函數在我創建的可執行jar中工作。

通過使用以下任何一種方法,我都可以使項目在Eclipse中正常工作:

  1. 通過在Source文件夾中指定本機庫位置,在構建路徑配置中引用包含dll的文件夾
  2. 將dll放在C:\\ Windows \\ System32目錄中
  3. 在我的項目“ -Djava.library.path = path / to / dllfolder”中添加以下dll參數引用dll文件夾的相對路徑

我嘗試的第四種方法是直接通過以下行在代碼中加載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);
            }
        }
    });     
}

}

我已經閱讀了很多有關將dll與可執行jar一起使用的文章,並且它們似乎都使用此System.load方法進行引用。 具有諷刺意味的是,那是我無法工作的一件事。 我知道我有正確的dll; 但是,因為我可以在IDE環境中使用其他方法。 我不在乎dll是否與可執行jar一起打包,我只是希望它能工作!

我認為這與將dll放入您的庫有關

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

導出jar時,還可以選擇將庫文件導出到文件夾中。

如果在那之后對Jar進行反編譯,您會發現其中有一個清單文件,其中包含庫文件的路徑(基於導出,該導出為您創建了一個庫文件夾,通常為jarname_lib)。

導出時,您可以選擇另存為ANT文件,然后可以對其進行編輯以將庫文件的導出位置更改為您選擇的文件夾名稱。 然后,您可以將此編輯后的ANT文件添加到您的構建中,以便在構建項目時都會發生:

(In Eclipse, Properties->Builders->New)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM