2014-02-18 2 views
0

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

$ 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 

до сих пор так липкая, Бросаю исполнение, как он выполняет их в цикле в то время как каждые 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%) 

Ok. Создан файл 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) 

И эта стекловата бросается. Я видел на another question что:

В случае баночек, то -cp и -classpath аргументы и переменная среда %CLASSPATH% игнорируются.

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

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

+0

Почему вы не используете Eclipse? Он может сделать это легко. – elias

ответ

3

решена проблема в настоящее время, используя следующий файл манифеста:

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.

1

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

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

Ant также может это сделать as explained in this other question.

Смежные вопросы