Я пытаюсь развернуть приложение Swing, которое использует dll для облегчения подключения к базе данных (используя jar sqljdbc4, который зависит от sqljdbc_auth.dll). Моя стратегия развертывания заключается в создании исполняемого файла jar. Проблема в том, что я не могу заставить функции, которые полагаются на sqljdbc_auth.dll, работать в исполняемом банке, который я создаю.
Я могу заставить проект работать нормально в eclipse, используя любой из следующих методов:
- Ссылка на папку, содержащую dll, в конфигурации пути сборки, указав расположение собственной библиотеки в исходной папке.
- Поместите dll в каталог C:\Windows\System32
- Добавьте следующий аргумент виртуальной машины, ссылающийся на относительный путь к папке dll в моем проекте: «-Djava.library.path=path/to/dllfolder».
Четвертый метод, который я пробовал, - загрузить 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 для использования при установлении соединения.
В любом случае, я не могу заставить что-либо из вышеперечисленных методов работать, когда я развертываю приложение в виде исполняемого файла jar с помощью функции экспорта eclipse. Единственное, что я могу получить, это ранее упомянутое сообщение об ошибке.
Следующий пример приложения дает тот же результат.
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 или нет, я просто хочу, чтобы она работала!