Я пытаюсь развернуть приложение swing, которое использует DLL для облегчения подключения к базе данных (с использованием sqljdbc4 jar, который зависит от sqljdbc_auth.dll). Моя стратегия развертывания создает исполняемый файл jar. Проблема в том, что я не могу получить функции, которые полагаются на sqljdbc_auth.dll для работы в исполняемом банке, который я создаю.Executable Jar with Dependency on dll
я могу получить проект работает отлично в затмении, используя любой из следующих методов:
- Reference папка, содержащая DLL в конфигурации пути сборки, указав Native расположение библиотеки на папке Source
- Поместите DLL в C: \ Windows \ System32
- Добавьте следующий аргумент VM ссылки на относительный путь к папке длл в моем проекте "-Djava.library.path = путь/к/dllfolder"
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 для использования в создании соединения.
В любом случае, я не могу получить что-либо из вышеперечисленных методов, когда я развертываю приложение как исполняемый файл 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х с исполняемыми банками и все они, кажется, ссылкой, используя этот метод System.load. По иронии судьбы, это одна вещь, с которой я не могу работать. Я знаю, что у меня есть правильная dll; однако, поскольку я могу использовать другие методы для работы в среде IDE. Мне все равно, если dll упакован с исполняемым банком или нет, я просто хочу, чтобы он работал!
Спасибо за совет.Я добавил местоположение папки DLL (попробовал как внешнюю папку, так и папку в проекте) как место для Native-библиотеки на пути Java Build Path (это единственный способ выяснить, как это сделать, не создавая ошибок сборки). Это отлично работает в eclipse, но он все равно не работает, когда я экспортирую проект. Я также сохранил ANT-файл, но он экспортировал только библиотеки jar, а не dll. Поэтому я понятия не имею, где разместить DLL или как попытаться ссылаться на их местоположение. – CurtisF
В файле ANT, в теге '', я бы предположил, что dll должен находиться в пути класса, точно так же, как в jars. Итак, вот так: ' '. В этом случае, если основной фрейм был в 'C: /', который экспортировал бы файлы библиотеки в 'C:/my_lib' Что касается экспорта dll и jars, это выглядело бы как' 'delete dir = C:/my_lib "/> ' –
Получил это действие. Настройка манифеста позволила мне переместить некоторые переключатели, которые я раньше не мог. В качестве ссылки для других, у кого может возникнуть проблема, я обнаружил, что если вы не хотите связываться с манифестом, вы также можете поместить dll в папку bin из java install, так как это расположение библиотеки по умолчанию. – CurtisF