2015-03-20 3 views
0

Я пытаюсь развернуть приложение swing, которое использует DLL для облегчения подключения к базе данных (с использованием sqljdbc4 jar, который зависит от sqljdbc_auth.dll). Моя стратегия развертывания создает исполняемый файл jar. Проблема в том, что я не могу получить функции, которые полагаются на sqljdbc_auth.dll для работы в исполняемом банке, который я создаю.Executable Jar with Dependency on dll

я могу получить проект работает отлично в затмении, используя любой из следующих методов:

  1. Reference папка, содержащая DLL в конфигурации пути сборки, указав Native расположение библиотеки на папке Source
  2. Поместите DLL в C: \ Windows \ System32
  3. Добавьте следующий аргумент 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 упакован с исполняемым банком или нет, я просто хочу, чтобы он работал!

ответ

0

Я полагаю, это что-то делать с введением в DLL файлы в библиотеке

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

При экспорте баночку, вы также будете иметь возможность экспортировать файлы библиотеки в папку.

Если вы декомпилируете Jar после этого, вы заметите, что есть файл манифеста, и в нем есть пути к тому, где находятся файлы вашей библиотеки (на основе экспорта, который создал для вас папку библиотеки, обычно jarname_lib) ,

При экспорте у вас есть возможность сохранить в виде файла ANT, который затем можно изменить, чтобы изменить расположение экспорта файлов библиотеки на выбранное вами имя папки. Затем вы можете добавить этот отредактированный ANT-файл в свою сборку, чтобы это происходило всякий раз, когда вы строите проект:

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

Спасибо за совет.Я добавил местоположение папки DLL (попробовал как внешнюю папку, так и папку в проекте) как место для Native-библиотеки на пути Java Build Path (это единственный способ выяснить, как это сделать, не создавая ошибок сборки). Это отлично работает в eclipse, но он все равно не работает, когда я экспортирую проект. Я также сохранил ANT-файл, но он экспортировал только библиотеки jar, а не dll. Поэтому я понятия не имею, где разместить DLL или как попытаться ссылаться на их местоположение. – CurtisF

+0

В файле ANT, в теге '', я бы предположил, что dll должен находиться в пути класса, точно так же, как в jars. Итак, вот так: ''. В этом случае, если основной фрейм был в 'C: /', который экспортировал бы файлы библиотеки в 'C:/my_lib' Что касается экспорта dll и jars, это выглядело бы как' 'delete dir = C:/my_lib "/>' –

+0

Получил это действие. Настройка манифеста позволила мне переместить некоторые переключатели, которые я раньше не мог. В качестве ссылки для других, у кого может возникнуть проблема, я обнаружил, что если вы не хотите связываться с манифестом, вы также можете поместить dll в папку bin из java install, так как это расположение библиотеки по умолчанию. – CurtisF