#java #sqlite #jdbc #connection
Вопрос:
У меня возникли проблемы с подключением к моей базе данных SQLite. На моем ПК с Windows все работает нормально, но если я хочу запустить свою программу на Linux(Raspberry PI), я получаю ошибку, как показано в заголовке.
Это мое подключение к Windows:
public static final String DB_NAME = "settings.db";
public static final String CONNECTION_STRING = "jdbc:sqlite:C:\Users\oschr\eclipse-workspace\Dippmitteldosierer\src\" DB_NAME;
Прежде чем экспортировать свою программу для Linux, я изменяю строку подключения:
public static final String CONNECTION_STRING = "jdbc:sqlite:/home/pi/Desktop/" DB_NAME;
Если базы данных нет, я создаю ее с помощью этого кода:
String url = CONNECTION_STRING;
try {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection = DriverManager.getConnection(url);
statement = connection.createStatement();
statement.execute("CREATE TABLE IF NOT EXISTS " TABLE_VORWAHLMENGEN "( " COLUMN_VORWAHLNAME " TEXT, " COLUMN_VORWAHLMENGE " INTEGER)");
statement.execute("CREATE TABLE IF NOT EXISTS " TABLE_KALIBRIERUNGEN "( " COLUMN_KALIBRIERUNGNAME " TEXT, " COLUMN_KALIBRIERUNGMENGE " INTEGER)");
Это мой путь сборки:
Это мой проект:
Кто-нибудь может мне помочь, пожалуйста?
Комментарии:
1. Вы тоже получаете
ClassNotFoundException
?
Ответ №1:
Вы используете какой-то процесс, который вы не объяснили в своем вопросе, чтобы сделать банку. Затем вы отправляете эту банку в pi и запускаете ее там.
Процесс, который вы используете, просто превращает ваш код в банку. Это не включает все ваши зависимости; обычно это не делается, так как это делает банки гигантскими и усложняет обновления.
Вариант 1: исполняемые файлы jar с записями пути к классам
Вам нужно создать банку , в которой Class-Path
в манифесте указана запись jdbc-sqlite.jar
, а затем убедиться, что эта банка доступна в том же каталоге, что и «брат» yourapp.jar
. Как? Ну, это зависит от того, какой процесс превращает файлы ваших классов в файлы jar.
Вариант 2: Не используйте java -jar
его для запуска.
Вы можете сделать это вручную, если побежите java -jar sqlite.jar:yourapp.jar com.foo.YourMainClass
туда.
Вариант 3: Чередование
Обновите этот процесс, чтобы он объединил dep(ы) в одну гигантскую банку всего. Как правило, для этого вам нужна система сборки, такая как maven или gradle.
Комментарии:
1. Я не знаю, как сделать Вариант 1. ДОЛЖЕН ли я поставить sqlite.jar в папке, которая содержит мое приложение? Как я должен написать запись о пути к классу? Вариант 2 не сработал, он выдал ошибку: Не удалось получить доступ к файлу jar sqlite.jar:myapp.jar
2. Разве я не могу сделать это с помощью Eclipse автоматически? Или мне следует использовать Intellij, если в eclipse нет этой функции?
3. вариант 2: тривиально, так как вам не нужно ничего менять. В остальном: Да, но «сборка с помощью IDE» не рекомендуется для этого; вместо этого создайте сборку (на основе maven или gradle). Затем Eclipse может без проблем рассматривать ваш проект как проект maven.
4. В eclipse щелкните правой кнопкой мыши на своем проекте, экспорт… -> запускаемый файл jar — > > «обработка библиотек: извлечение необходимых библиотек в сгенерированную банку» даст вам что-то вроде варианта № 3.
5. Если я извлекаю необходимые библиотеки в сгенерированный jar и пытаюсь запустить свое приложение на Rasberry Pi, я получаю сообщение об ошибке: Недопустимый или поврежденный файл jar Myapp.jar. Извините, но я ничего не знаю о мэйвене. Почему мое приложение работает в Windows без проблем, но не в Linux….?!?