0

我在一个文件夹中有一个类和一个 jar。sqlite-jdbc-3.7.2.jar dbBuilder.class

要运行 dbBuilder.class 我在命令行上运行它:

java -classpath ".:sqlite-jdbc-3.7.2.jar" dbBuilder

现在,如果我想将这两个 Jar 组合在一起,我将创建一个如下所示的清单:

Main-Class: dbBuilder
Class-Path: sqlite-jdbc-3.7.2.jar

我编译它:

jar cfm dbTest.jar Manifest.txt dbBuilder.class sqlite-jdbc-3.7.2.jar

然后运行它:

 java -jar dbBuilder.jar 

我得到了这个堆栈跟踪:

线程“main”中的异常 java.lang.ClassNotFoundException: org.sqlite.JDBC at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net。 URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass (ClassLoader.java:247) 在 java.lang.Class.forName0(Native Method) 在 java.lang.Class.forName(Class.java:171) 在 dbBuilder.createTables(dbBuilder.java:22) 在 dbBuilder.main( dbBuilder.java:67)

我很困惑,因为我在没有 jar 的情况下运行它时使用的类路径与我放入清单中的类路径不同,但我尝试使用我用来将其作为类运行并将其放入清单中的类路径那也没有用。所以我不知道如何编译它,还要跟进 - 一旦我让这个 dbBuilder.jar 工作,我能再次 jar 并仍然访问 sqlite 类吗?提前致谢 !!

4

1 回答 1

1

JAR 文档是这样说的:

"Class-Path:该属性的值指定了该应用程序或扩展程序需要的扩展程序或库的相对 URL。URL 由一个或多个空格分隔。应用程序或扩展类加载器使用该属性的值来构造它的内部搜索路径。”

如果相对 URL 具有相对路径,它们将相对于包含主 JAR 文件的目录进行解析。(参考:https ://stackoverflow.com/a/16502944/139985 )

在您的示例中,这意味着dbTest.jar并且sqlite-jdbc-3.7.2.jar需要位于同一目录中。我希望这就是你在这里做错的。

于 2013-08-06T02:14:07.207 回答