LINUX.ORG.RU

запуск программ и jar-файлов в Java. Подскажите


0

0

Написал простенькую программу на Java (только недавно стал изучать), она коннектится к ораклу и делает запрос. Когда я запускаю её - всё нормально.
Но вот я хочу сделать jar, создаю, добавляю туда мой main.class,
получается внутри каталог classTest и в нём мой файл main.class,
в манифесте пишу Main-Class: classTest/main и вот ....
мой архив не работает :( результат ниже.
Подскажите, чего ему может не хватать, если без архива программа
работает, а в архиве - нет! Импортится только оракловый архив,
ему я и прописываю classpath. Непонятно, почему мой архив не может найти драйвер оракла, хотя программа находит.


[roman@romanu \ Wed Feb  2 \ 09:22:42 -> Java]$ java -classpath /Oracle/OraHome/jdbc/lib/classes111.zip:$PWD classTest/main
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
[roman@romanu \ Wed Feb  2 \ 09:22:52 -> Java]$ java -classpath /Oracle/OraHome/jdbc/lib/classes111.zip:$PWD -jar classTest/testJar.jar
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at classTest.main.main(main.java:28)
Exception in thread "main" java.sql.SQLException: No suitable driver
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at classTest.main.main(main.java:35)
[roman@romanu \ Wed Feb  2 \ 09:23:08 -> Java]$

Ответ на: комментарий от Xela

Так я ж русским языком написал, что я подключаю classpath.
Может быть этого мало??? вот в том архиве /Oracle/OraHome/jdbc/lib/classes111.zip и лежит
этот самый драйвер!!! И main.class работает!
А вот если её положить в jar - то не работает.
Получается, что в одном случае находит, а в другом - нет!

Вот, смотрите:

[roman@romanu \ Wed Feb  2 \ 09:44:37 -> Java]$ java -classpath $PWD classTest/main
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at classTest.main.main(main.java:28)
Exception in thread "main" java.sql.SQLException: No suitable driver
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at classTest.main.main(main.java:35)
[roman@romanu \ Wed Feb  2 \ 09:44:43 -> Java]$ java -classpath /Oracle/OraHome/jdbc/lib/classes111.zip:$PWD classTest/main
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
[roman@romanu \ Wed Feb  2 \ 09:44:50 -> Java]$

В чём же проблема? почему jar не находит драйвер?

RomanU
() автор топика
Ответ на: комментарий от RomanU

>Получается, что в одном случае находит, а в другом - нет!

в джар впихнул - у тебя изменилас иерархия нахождения чего либо

Pi ★★★★★
()
Ответ на: комментарий от Pi

Хорошо, то есть плохо.
Добился следующего:

[roman@romanu \ Wed Feb  2 \ 11:24:02 -> Java]$ java -Xbootclasspath/p:/Oracle/OraHome/jdbc/lib/classes111.zip:$PWD -jar classTest/testJar.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc8 in java.library.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at oracle.jdbc.oci8.OCIDBAccess.logon(OCIDBAccess.java)
        at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java)
        at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at classTest.main.main(main.java:35)
[roman@romanu \ Wed Feb  2 \ 11:24:20 -> Java]$

Т.е. драйвера всё же нашлись. Следующая ошибка - не может загрузить
библиотеку ocijdbc8.

Проверяем:

[roman@romanu \ Wed Feb  2 \ 11:24:20 -> Java]$ ls -l $ORACLE_HOME/lib/*ocijdbc8*
-rwxr--r--    1 roman    roman      545441 Ноя  9  2000 /Oracle/OraHome/lib/libocijdbc8_g.so
-rwxr--r--    1 roman    roman      545445 Ноя  9  2000 /Oracle/OraHome/lib/libocijdbc8.so

Ага, библиотека там всё-таки есть.
Пробуем использовать вот что: java -Djava.library.path=$LD_LIBRARY_PATH ....
То же самое!

[roman@romanu \ Wed Feb  2 \ 11:25:55 -> Java]$ echo $LD_LIBRARY_PATH
/Oracle/OraHome/lib:/Oracle/OraHome/lib:/Oracle/OraHome/lib:/Oracle/OraHome/lib:


[roman@romanu \ Wed Feb  2 \ 11:28:14 -> Java]$ java -Djava.library.path=$LD_LIBRARY_PATH -Xbootclasspath/p:/Oracle/OraHome/jdbc/lib/classes111.zip:$PWD -jar classTest/testJar.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc8 in java.library.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at oracle.jdbc.oci8.OCIDBAccess.logon(OCIDBAccess.java)
        at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java)
        at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at classTest.main.main(main.java:35)
[roman@romanu \ Wed Feb  2 \ 11:28:32 -> Java]$

Где ж копать, люди?
Если я знаю, что библиотека всё-таки есть там ... то почему не работает
загрузка, хотя $LD_LIBRARY_PATH установлена, и даже через -Djava.library.path не пашет.... :(

RomanU
() автор топика
Ответ на: комментарий от RomanU

Всё, разобрался сам.
Надо было оказывается просто скопировать из classes111.zip в мой jar-файл.
Теперь всё работает :)

[roman@romanu \ Wed Feb  2 \ 15:01:13 -> classTest]$ java -jar testJar.jar
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
[roman@romanu \ Wed Feb  2 \ 15:11:30 -> classTest]$

RomanU
() автор топика
Ответ на: комментарий от RomanU

Всё или ничего??

вот ещё один вопрос:

Если у меня есть архив с дровами JDBC (classes111.zip),
есть архив testJar.jar с моей программой main.class,
то неужели существует только 2 метода запуска моей программы main.class,
которая зависит от пакетов из classes111.zip ???

1) java -classpath $ORACLE_HOME/jdbc/lib/classes111.zip:testJar.jar main
В этом случае работает. но ведь неудобно! Нужно знать имя основного класса.
Хотелось бы ведь это автоматизировать.

2) java -jar testJar.jar
В этом случае для нормального запуска мне приходится копировать содержимое
файла classes111.zip в мой testJar.jar.
Здесь никаким образом я не смог по-другому заставить увидеть пакеты из
classes111.zip, поэтому пришлось скопировать в мой архив.
Может быть так даже правильно. Подскажите.

Есть большое подозрение, что содержимое classes111.zip может меняться.

Вообщем, НАСКОЛЬКО я понимаю ситуацию, мне надо запустить мой архив
наиболее удобным способом (желательно без указания основного класса как в 1 случае).

Вопрос: можно ли указать для архива testJar.jar другой архив,
в котором находятся нужные мне пакеты так, чтобы работало??
Или только вот двумя выше перечисленными мною способами?
Извините, если мысли расплывчатые ... почти весь день с этим
бьюсь.

Знатоки Java и JAR помогите .....

RomanU
() автор топика
Ответ на: Всё или ничего?? от RomanU

Действительно, третьего не дано .....
......................

You use -classpath OR -jar, not both.

http://java.sun.com/j2se/1.4.2/docs...ndows/java.html
-jar
Execute a program encapsulated in a JAR file. The first argument is
the name of a JAR file instead of a startup class name. In order for
this option to work, the manifest of the JAR file must contain a line of
the form Main-Class: classname. Here, classname identifies the class
having the public static void main(String[] args) method that serves as
your application's starting point. See the Jar tool reference page and
the Jar trail of the Java Tutorial for information about working with
Jar files and Jar-file manifests.

When you use this option, the JAR file is the source of all user
classes, and other user class path settings are ignored.
--

Тогда первый вариант мне предпочтительнее.

RomanU
() автор топика
Ответ на: комментарий от RomanU

про MANIFEST.MF почитай - там все указать можно

svr69 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.