我有一个JAVA程序,它连接MySQL和执行者一些更新任务。我现在想要将应用程序导出为包含JDBC包的jar
文件。对于以下所有命令,我正在执行类似( 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
到目前为止goo,我正在退出执行,因为它每30分钟在一个while循环中执行它们。
现在,创建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)
这个堆栈跟踪被抛出。我在another question看到:
如果是JAR,
-cp
和-classpath
参数以及%CLASSPATH%
环境变量被忽略。
我需要手动修改MANIFET.MF
文件,然后重新创建jar。但上面链接的答案表明类路径应该是相对于我自己的jar文件(sth.jar
),并没有提到如何处理捆绑的jar文件。
如何在我的包中导入JDBC,以便生成的jar文件“正常”运行。任何帮助将不胜感激。
答案 0 :(得分:3)
使用以下MANIFEST文件解决了当前的问题:
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 :(得分:1)
在生成的JAR根目录中包含必需的JAR并在运行时加载它们(这意味着您需要ClassLoader
来处理此问题。)
大多数IDE都会为您执行此操作,例如在Eclipse中,您只需告诉它“在JAR中打包所需的库”。
Ant 也可以这样做as explained in this other question。