Re[6]: ClassNotFoundException, CLASSPATH правильный.
От: RomikT Германия  
Дата: 05.10.11 18:46
Оценка: 3 (2)
Здравствуйте, RobinBobin, Вы писали:

RB>Я пошёл по первому пути. url — действительный полный путь к ojdbc6_g.jar.

RB>...
RB>Но вот эта строчка
RB>
RB>Class.forName("oracle.jdbc.OracleDriver");
RB>

RB>вызывает ClassNotFoundException. Какие грабли я ещё не заметил? Как в этом случае надо правильно зарегистрировать драйвер?

Видимо, надо так.
Re[7]: ClassNotFoundException, CLASSPATH правильный.
От: abch-98-ru Россия  
Дата: 06.10.11 09:24
Оценка: +1
UDI>>В 6 в манифесте маски работают, можно написать что-то вроде
UDI>>Class-Path: ./libs/*
B>Странно, в доках нигде нет. Есть где почитать?
зато там есть обратное утверждение:
However, class path wildcards are not honored in the Class-Path jar-manifest header.
ClassNotFoundException, CLASSPATH правильный.
От: RobinBobin  
Дата: 05.10.11 12:58
Оценка:
Доброго времени суток!

Нужно написать простое консольное приложение, которое умело бы коннектиться через jdbc к разным БД. Общий смысл: программа запрашивает у юзера имя драйвера (например, oracle.jdbc.OracleDriver, потом сделаю нормально), делает Class.forName() ну и т.д.

Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется. Я прописал в CLASSPATH путь к jdbc-драйверу для оракл, команда

java oracle.jdbc.OracleDriver


отрабатывает на ура. Но когда я делаю

Class.forName("oracle.jdbc.OracleDriver")


или

ClassLoader.getSystemClassLoader().loadClass("oracle.jdbc.OracleDriver")


, то ловлю ClassNotFoundException.

В чём проблема?

Пишу под Win7 в Eclipse 3.6.2.

Спасибо.
Re: ClassNotFoundException, CLASSPATH правильный.
От: Blazkowicz Россия  
Дата: 05.10.11 13:16
Оценка:
Здравствуйте, RobinBobin, Вы писали:

R>Я прописал в CLASSPATH путь к jdbc-драйверу для оракл


Используейте -cp параметр при запуске jvm
http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html

Либо Class-Path в манифесте при упаковке в jar
http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html
Re: ClassNotFoundException, CLASSPATH правильный.
От: Donz Россия http://donz-ru.livejournal.com
Дата: 05.10.11 13:20
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется. Я прописал в CLASSPATH путь к jdbc-драйверу для оракл, команда


CLASSPATH — это что именно: переменная окружения, ключик -cp или класспас в манифесте в джаре?

Если запускаешь через -jar, то все классы должны или лежать внутри джара, или должны быть прописаны в манифесте. Остальные способы задания класспаса игнорируются: http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html
Re[2]: ClassNotFoundException, CLASSPATH правильный.
От: Donz Россия http://donz-ru.livejournal.com
Дата: 05.10.11 13:22
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Используейте -cp параметр при запуске jvm

B>http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html

Судя по всему, у человека 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

Это по идее должно сработать
Re[2]: ClassNotFoundException, CLASSPATH правильный.
От: RobinBobin  
Дата: 05.10.11 13:22
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, RobinBobin, Вы писали:


R>>Я прописал в CLASSPATH путь к jdbc-драйверу для оракл


B>Используейте -cp параметр при запуске jvm

B>http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html

B>Либо Class-Path в манифесте при упаковке в jar

B>http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html

Спасибо за ответ!

А почему не работает-то через переменную окружения CLASSPATH?

При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?
Re: ClassNotFoundException, CLASSPATH правильный.
От: RobinBobin  
Дата: 05.10.11 13:38
Оценка:
Здравствуйте, RobinBobin, Вы писали:

Всем большое спасибо за ответы.

Я понял насчёт


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-драйверы, которые мне нужны?
Re[2]: ClassNotFoundException, CLASSPATH правильный.
От: Blazkowicz Россия  
Дата: 05.10.11 13:42
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>Но всё-таки. При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?

Нужен список всех jar файлов в виде абсолютных или относительных путей.
Можно запускать через java -cp application.jar;driver.jar MainClass
Возьмите в руки Ant. Им можно список всех файлов в папке в манифест засадить.
Re[3]: ClassNotFoundException, CLASSPATH правильный.
От: RobinBobin  
Дата: 05.10.11 14:01
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, RobinBobin, Вы писали:


RB>>Но всё-таки. При использовании class-path в манифесте я могу указать не путь к конкретному jar-файлу, а папку, где будут лежать все jdbc-драйверы, которые мне нужны?

B>Нужен список всех jar файлов в виде абсолютных или относительных путей.
B>Можно запускать через java -cp application.jar;driver.jar MainClass
B>Возьмите в руки Ant. Им можно список всех файлов в папке в манифест засадить.

Спасибо.

Но в том-то и дело, что я не знаю заранее список jar-файлов, которые мне потом понадобятся.

Получается, я не могу завести волшебную директорию, содержимое jar-файлов из которой будет доступно моей программе, запускаемой в виде 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.

user classes — это вообще все-все классы, которые я юзаю?

Простите за ламерские вопросы, я всегда писал на си++, сейчас по работе перешёл на джаву.
Re[4]: ClassNotFoundException, CLASSPATH правильный.
От: Blazkowicz Россия  
Дата: 05.10.11 14:17
Оценка:
Здравствуйте, 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
Re[4]: ClassNotFoundException, CLASSPATH правильный.
От: RomikT Германия  
Дата: 05.10.11 14:17
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>Получается, я не могу завести волшебную директорию, содержимое jar-файлов из которой будет доступно моей программе, запускаемой в виде jar-файла, без какого-либо изменения её или её манифеста? Что-то типа: положил в волшебную директорию один jdbc-драйвер, программа может только к одной БД коннектиться. Положил второй — уже к двум. Сама, вообще без изменений.


Можно
  • Создать URLClassLoader указывающий на эту папку и загружать классы им. Только потом надо правильно зарегистрировать JDBC драйвера,
  • Запускать программу не через java -jar, а через java -cp ... my.main.Class.
  • Re[4]: ClassNotFoundException, CLASSPATH правильный.
    От: Blazkowicz Россия  
    Дата: 05.10.11 14:23
    Оценка:
    Здравствуйте, RobinBobin, Вы писали:

    В Java 7 добавили маски:
    http://download.oracle.com/javase/7/docs/technotes/tools/windows/java.html
    Re[5]: ClassNotFoundException, CLASSPATH правильный.
    От: UDI Россия  
    Дата: 05.10.11 14:42
    Оценка:
    Здравствуйте, Blazkowicz, Вы писали:

    B>Здравствуйте, RobinBobin, Вы писали:


    B>В Java 7 добавили маски:

    B>http://download.oracle.com/javase/7/docs/technotes/tools/windows/java.html

    В 6 в манифесте маски работают, можно написать что-то вроде
    Class-Path: ./libs/*
    "Не волнуйся, голова! Теперь будет думать компьютер"
    Гомер Джей Симпсон
    Re[5]: ClassNotFoundException, CLASSPATH правильный.
    От: RobinBobin  
    Дата: 05.10.11 18:41
    Оценка:
    Здравствуйте, 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. Какие грабли я ещё не заметил? Как в этом случае надо правильно зарегистрировать драйвер?

    Спасибо.
  • Re[7]: ClassNotFoundException, CLASSPATH правильный.
    От: RobinBobin  
    Дата: 06.10.11 04:49
    Оценка:
    Здравствуйте, RomikT, Вы писали:

    RT>Здравствуйте, RobinBobin, Вы писали:


    RB>>Я пошёл по первому пути. url — действительный полный путь к ojdbc6_g.jar.

    RB>>...
    RB>>Но вот эта строчка
    RB>>
    RB>>Class.forName("oracle.jdbc.OracleDriver");
    RB>>

    RB>>вызывает ClassNotFoundException. Какие грабли я ещё не заметил? Как в этом случае надо правильно зарегистрировать драйвер?

    RT>Видимо, надо так.


    Да, помогло, большое спасибо.

    Всем-всем тоже большое спасибо .
    Re[6]: ClassNotFoundException, CLASSPATH правильный.
    От: Blazkowicz Россия  
    Дата: 06.10.11 08:21
    Оценка:
    Здравствуйте, UDI, Вы писали:

    UDI>В 6 в манифесте маски работают, можно написать что-то вроде

    UDI>Class-Path: ./libs/*
    Странно, в доках нигде нет. Есть где почитать?
    Re: ClassNotFoundException, CLASSPATH правильный.
    От: tavr  
    Дата: 06.10.11 10:34
    Оценка:
    Здравствуйте, RobinBobin, Вы писали:

    RB>Нужно написать простое консольное приложение, которое умело бы коннектиться через jdbc к разным БД. Общий смысл: программа запрашивает у юзера имя драйвера (например, oracle.jdbc.OracleDriver, потом сделаю нормально), делает Class.forName() ну и т.д.

    заставлять пользователя вводить имя драйвера плохая идея
    лучше предлагать простейшее окно регистрации базы данных: тип базы/host/user/password например MySQL 5.11/localhost/root/
    соответствие базы к дефолтным настройкам будут храниться в вашем конфиге

    RB>Если зависимость от jdbc драйвера я прописываю в еклипсе, то всё прекрасно работает. Но список БД будет расширяться, а каждый раз пересобирать и распространять jar не хочется.

    В чем проблема запихнуть сразу 4-5 общеупотребительных JDBC драйверов в программу — вы покроете 90% всех случаев
    добавьте еще пяток — будет 99% покрытие
    Re[7]: ClassNotFoundException, CLASSPATH правильный.
    От: UDI Россия  
    Дата: 06.10.11 12:13
    Оценка:
    Здравствуйте, Blazkowicz, Вы писали:

    B>Здравствуйте, UDI, Вы писали:


    UDI>>В 6 в манифесте маски работают, можно написать что-то вроде

    UDI>>Class-Path: ./libs/*
    B>Странно, в доках нигде нет. Есть где почитать?

    Ошибся. Помнил, что где-то писал через маски, но не помнил где именно. Предположил, что в манифесте, раз в аргументах нельзя. Сейчас посмотрел, я писал через аргументы запуска java -cp ./libs/*;
    "Не волнуйся, голова! Теперь будет думать компьютер"
    Гомер Джей Симпсон
    Re: ClassNotFoundException, CLASSPATH правильный.
    От: Stanislav Elinson  
    Дата: 11.10.11 15:30
    Оценка:
    Posmotri http://www.sql-workbench.net/
    Posted via RSDN NNTP Server 2.1 beta
    Re[2]: ClassNotFoundException, CLASSPATH правильный.
    От: Аноним  
    Дата: 11.10.11 19:28
    Оценка:
    Здравствуйте, Stanislav Elinson, Вы писали:

    SE>Posmotri http://www.sql-workbench.net/


    Спасибо.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.