Экспорт jdbc в файл jar проекта

У меня есть программа JAVA, которая подключается к MySQL и выполняет некоторые задачи обновления. Теперь я хочу экспортировать приложение как jar файл с включенным пакетом JDBC. Я делаю что-то вроде (pwd для всех следующих команд: /home/tnp/UpdateServer_SRC/bin/):

$ echo $CLASSPATH 
.:/home/tnp/UpdateServer_SRC/bin/update/server:/home/tnp/UpdateServer_SRC/bin/update/server/jdbc.jar
$ java update.server.Main
Latest: 12177
IGNORING: 12172
IGNORING: 12173
IGNORING: 12174
IGNORING: 12175
IGNORING: 12176
IGNORING: 12177
^C

пока что хорошо, я выхожу из выполнения, поскольку он выполняет их в цикле while каждые 30 минут.

Теперь создадим файл jar:

$ jar cvf sth.jar update
added manifest
adding: update/(in = 0) (out= 0)(stored 0%)
adding: update/server/(in = 0) (out= 0)(stored 0%)
adding: update/server/ThreadNetwork.class(in = 1866) (out= 1021)(deflated 45%)
adding: update/server/HomePage.class(in = 2046) (out= 1184)(deflated 42%)
adding: update/server/jdbc.jar(in = 876733) (out= 837707)(deflated 4%)
adding: update/server/UpdateLast5.class(in = 2045) (out= 1179)(deflated 42%)
adding: update/server/Main.class(in = 742) (out= 504)(deflated 32%)
adding: update/server/Notice.class(in = 2715) (out= 1521)(deflated 43%)

В порядке. Jar-файл создан. Попробуем запустить:

$ java -jar sth.jar 
no main manifest attribute, in sth.jar

О, pwd нет в моем текущем пути к классу. Дай мне попробовать снова:

$ java -cp sth.jar update.server.Main
Latest: 12177
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:190)
        at update.server.UpdateLast5.run(UpdateLast5.java:18)
        at java.lang.Thread.run(Thread.java:724)
Exception in thread "Thread-0" java.lang.NullPointerException
        at update.server.UpdateLast5.run(UpdateLast5.java:40)
        at java.lang.Thread.run(Thread.java:724)

И этот stacktrace брошен. Я видел в другом вопросе, что:

В случае файлов JAR аргументы -cp и -classpath и переменная среды %CLASSPATH% игнорируются.

и мне нужно будет вручную изменить файл MANIFET.MF и воссоздать банку. Но в приведенном выше ответе указано, что путь к классу должен относиться к моему собственному файлу jar (sth.jar) и не упоминается, что делать со связанными файлами jar.

Как мне импортировать JDBC в свой пакет, чтобы получившийся файл jar работал "нормально". Любая помощь будет оценена.


person hjpotter92    schedule 18.02.2014    source источник
comment
Почему бы вам не использовать Eclipse? Это может быть легко.   -  person elias    schedule 18.02.2014


Ответы (2)


В настоящее время проблема решена с помощью следующего файла МАНИФЕСТА:

Manifest-Version: 1.0
Created-By: 1.7.0_25 (Oracle Corporation)
Main-Class: update.server.Main
Class-Path: jdbc.jar

и поместив jdbc.jar в тот же каталог, что и мой sth.jar.

person hjpotter92    schedule 19.02.2014

Включите необходимые файлы JAR в сгенерированный корень JAR и загрузите их во время выполнения (что означает, что вам понадобится ClassLoader для обработки этого).

Большинство IDE делают это за вас, например, в Eclipse вы просто указываете «Упаковать необходимые библиотеки в JAR».

Ant также может сделать это , как описано в этом другом вопросе .

person m0skit0    schedule 18.02.2014