Нужно написать простое консольное приложение, которое умело бы коннектиться через jdbc к разным БД. Общий смысл: программа запрашивает у юзера имя драйвера (например, oracle.jdbc.OracleDriver, потом сделаю нормально), делает Class.forName() ну и т.д.
Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется. Я прописал в CLASSPATH путь к jdbc-драйверу для оракл, команда
Здравствуйте, RobinBobin, Вы писали:
RB>Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется. Я прописал в CLASSPATH путь к jdbc-драйверу для оракл, команда
CLASSPATH — это что именно: переменная окружения, ключик -cp или класспас в манифесте в джаре?
Судя по всему, у человека jar-файл. А значит этот ключик не сработает: When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
B>Либо Class-Path в манифесте при упаковке в jar B>http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html
А почему не работает-то через переменную окружения CLASSPATH?
При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?
When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
Но всё-таки. При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?
Здравствуйте, RobinBobin, Вы писали:
RB>Но всё-таки. При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?
Нужен список всех jar файлов в виде абсолютных или относительных путей.
Можно запускать через java -cp application.jar;driver.jar MainClass
Возьмите в руки Ant. Им можно список всех файлов в папке в манифест засадить.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, RobinBobin, Вы писали:
RB>>Но всё-таки. При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны? B>Нужен список всех jar файлов в виде абсолютных или относительных путей. B>Можно запускать через java -cp application.jar;driver.jar MainClass B>Возьмите в руки Ant. Им можно список всех файлов в папке в манифест засадить.
Спасибо.
Но в том-то и дело, что я не знаю заранее список jar-файлов, которые мне потом понадобятся.
Получается, я не могу завести волшебную директорию, содержимое jar-файлов из которой будет доступно моей программе, запускаемой в виде jar-файла, без какого-либо изменения её или её манифеста? Что-то типа: положил в волшебную директорию один jdbc-драйвер, программа может только к одной БД коннектиться. Положил второй — уже к двум. Сама, вообще без изменений.
Здравствуйте, RobinBobin, Вы писали:
RB>Но в том-то и дело, что я не знаю заранее список jar-файлов, которые мне потом понадобятся. RB>Получается, я не могу завести волшебную директорию, содержимое jar-файлов из которой будет доступно моей программе, запускаемой в виде jar-файла, без какого-либо изменения её или её манифеста? Что-то типа: положил в волшебную директорию один jdbc-драйвер, программа может только к одной БД коннектиться. Положил второй — уже к двум. Сама, вообще без изменений.
Это всё можно реализовать на ant, batch, shell или Java кодом. "Само по себе" такое не проиходит.
RB>When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
RB>user classes — это вообще все-все классы, которые я юзаю?
Это классы, которые не из JDK/JRE
Здравствуйте, RobinBobin, Вы писали:
RB>Получается, я не могу завести волшебную директорию, содержимое jar-файлов из которой будет доступно моей программе, запускаемой в виде jar-файла, без какого-либо изменения её или её манифеста? Что-то типа: положил в волшебную директорию один jdbc-драйвер, программа может только к одной БД коннектиться. Положил второй — уже к двум. Сама, вообще без изменений.
Можно
Создать URLClassLoader указывающий на эту папку и загружать классы им. Только потом надо правильно зарегистрировать JDBC драйвера,
Запускать программу не через java -jar, а через java -cp ... my.main.Class.
Здравствуйте, RomikT, Вы писали:
RT>Можно RT>Создать URLClassLoader указывающий на эту папку и загружать классы им. Только потом надо правильно зарегистрировать JDBC драйвера, RT>Запускать программу не через java -jar, а через java -cp ... my.main.Class.
Я пошёл по первому пути. url — действительный полный путь к ojdbc6_g.jar.
final URLClassLoader cl = URLClassLoader.newInstance(url);
final Class <?> clazz = cl.loadClass("oracle.jdbc.OracleDriver");
m_console.printf("class loaded%n");
Это срабатывает на ура, выводится сообщение, что класс загружен.
Но вот эта строчка
Class.forName("oracle.jdbc.OracleDriver");
вызывает ClassNotFoundException. Какие грабли я ещё не заметил? Как в этом случае надо правильно зарегистрировать драйвер?
Здравствуйте, RomikT, Вы писали:
RT>Здравствуйте, RobinBobin, Вы писали:
RB>>Я пошёл по первому пути. url — действительный полный путь к ojdbc6_g.jar. RB>>... RB>>Но вот эта строчка RB>>
Здравствуйте, UDI, Вы писали:
UDI>В 6 в манифесте маски работают, можно написать что-то вроде UDI>Class-Path: ./libs/*
Странно, в доках нигде нет. Есть где почитать?
Здравствуйте, RobinBobin, Вы писали:
RB>Нужно написать простое консольное приложение, которое умело бы коннектиться через jdbc к разным БД. Общий смысл: программа запрашивает у юзера имя драйвера (например, oracle.jdbc.OracleDriver, потом сделаю нормально), делает Class.forName() ну и т.д.
заставлять пользователя вводить имя драйвера плохая идея
лучше предлагать простейшее окно регистрации базы данных: тип базы/host/user/password например MySQL 5.11/localhost/root/
соответствие базы к дефолтным настройкам будут храниться в вашем конфиге
RB>Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется.
В чем проблема запихнуть сразу 4-5 общеупотребительных JDBC драйверов в программу — вы покроете 90% всех случаев
добавьте еще пяток — будет 99% покрытие
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, UDI, Вы писали:
UDI>>В 6 в манифесте маски работают, можно написать что-то вроде UDI>>Class-Path: ./libs/* B>Странно, в доках нигде нет. Есть где почитать?
Ошибся. Помнил, что где-то писал через маски, но не помнил где именно. Предположил, что в манифесте, раз в аргументах нельзя. Сейчас посмотрел, я писал через аргументы запуска java -cp ./libs/*;
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон