【问题标题】:Exporting jdbc in project jar file在项目 jar 文件中导出 jdbc
【发布时间】:2014-03-18 12:18:03
【问题描述】:

我有一个连接到 MySQL 并执行一些更新任务的 JAVA 程序。我现在想将应用程序导出为包含 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

到目前为止一切顺利,我将退出执行,因为它每 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 文件“正常”运行。任何帮助将不胜感激。

【问题讨论】:

  • 为什么不使用 Eclipse?它可以轻松做到这一点。

标签: java jdbc jar manifest manifest.mf


【解决方案1】:

通过使用以下 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 放在同一目录中。

【讨论】:

    【解决方案2】:

    在生成的 JAR 根目录中包含所需的 JAR 并在运行时加载它们(这意味着您需要 ClassLoader 来处理此问题)。

    大多数 IDE 都会为您执行此操作,例如在 Eclipse 中,您只需告诉它“在 JAR 中打包所需的库”。

    Ant 也可以这样做as explained in this other question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多