Я новичок в Java и столкнулся с проблемой, которая меня смутила. У меня есть приложение MyApp, которое я написал в IntelliJ. Приложение использует внешнюю библиотеку MyLib.jar, которая ведет переговоры с базой данных, используя sqljdbc42.jar от Microsoft. MyLib.jar и sqljdbc.jar установлены как внешние библиотеки в IntelliJ.Java как jar не может найти классы в sublibrary
Проблема у меня в том, что мое приложение работает отлично, когда я запускаю его в среде IDE, но когда я использую Generate Artifact для создания jar, ошибки jar возникают при попытке подключиться к базе данных.
Ошибка: class java.lang.ClassNotFoundException | com.microsoft.sqlserver.jdbc.SQLServerDriver
Это класс в sqljdbc42.jar. Я предполагаю, что это означает, что MyApp.jar не может видеть классы в sqljdbc42.jar.
sqljdbc42.jar не может быть включен в MyApp.jar из-за способа его подписания. Вместо этого, у меня есть файл в той же папке, MyApp.jar, и это мой MANIFEST.MF:
Manifest-Version: 1.0
Class-Path: sqljdbc42.jar
Main-Class: com.mycompany.myapp.Main
И это файл макета:
- MyApp_jar/
- sqljdbc42.jar
- MyApp.jar
Я другое приложение настройки так же, насколько я могу судить, и что .jar отлично работает с использованием того же класса.
UPDATE - Файл .jar, который я пытаюсь включить, является подписанной банкой. Любой другой файл jar, который я пытаюсь включить, работает отлично. Вот пример приложения для тестирования:
import com.microsoft.sqlserver.jdbc.SQLServerDriver;
public class Main
{
public static void main(String[] args)
{
try {
System.out.println(SQLServerDriver.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
И это баночка я не могу заставить работать: https://www.microsoft.com/en-us/download/details.aspx?id=11774 (4,2 версия)
очевидно, что все правильно. Вы проверили содержимое MANIFEST.MF, которое включено в JAR? Я имею в виду, откройте JAR с помощью WinZip или аналогичного (команда jar также сделает) и извлеките файл MANIFEST.MF, чтобы увидеть его содержимое. https://docs.oracle.com/javase/tutorial/deployment/jar/view.html –
Да, содержимое файла META-INF/MANIFEST.MF соответствует указанному выше. – Wige