0

我在使用 JDBC sqlite 时偶然发现了一个奇怪的错误,org.sqlite.JDBC 我的代码在 Windows 上编译并运行良好。但是当我尝试将其移至 Ubuntu 时,它开始显示:

Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        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:259)
        at mall.SQLiteJDBC.<init>(SQLiteJDBC.java:27)
        at mall.AllegroReader.<init>(AllegroReader.java:33)
        at mall.Mall.main(Mall.java:31)

我正在与我的 jar 所在目录中的两个版本一起运行它,java -classpath "sqlite-jdbc-3.7.2.jar" -jar Mall.jar"并且java -classpath "sqlite-jdbc4-3.8.2-SNAPSHOT.jar" -jar Mall.jar 我尝试了十几个不同的选项来指定类路径,并且它的行为完全相同。我试过openjdk和oracle jdk。我尝试在 Ubuntu 上重建它,更改 ant .xmls,更改路径等。

我不知道发生了什么。请帮忙。

这是我的 dist 目录中发生的事情:

work1@workwork:/var/www/mall/dist$ ls
mall.db  Mall.jar  Mall.jar.old  sqlite-jdbc-3.8.4.3-SNAPSHOT.jar

work1@workwork:/var/www/mall/dist$ java -classpath "sqlite-jdbc-3.8.4.3-SNAPSHOT.jar:Mall.jar" Mall
Error: Could not find or load main class Mall
4

2 回答 2

2

使用时忽略类路径-jar

您必须在 jar 中包含依赖项(或者至少让 jar 清单指向它们),或者使用-classpath sqlite.jar:Mall.jar the.main.class.

错误:无法找到或加载主类 Mall.main。所有文件都在那里,我的主类来自Mall.java并位于mall编译为的包中Mall.jar

所以正确的命令行是:

java -classpath "sqlite-jdbc-3.8.4.3-SNAPSHOT.jar:Mall.jar" mall.Mall

手术结果

查看 jar 使用中的类jar tf Mall.jar- 从这里我得到mall/Mall.class的意思是我的类包含 main 是mall.Mall

这显示了

商场/Mall.class

所以我应该使用 mall.Mall 作为类来运行(而不是拉我的头发)

于 2014-06-09T10:05:14.617 回答
0

在使用类路径和诸如此类的东西运行“便携式”jar 包时,总共花费了 6 多个小时,但在尝试了 OneJar 和 jarjar 无济于事(最终得到Class file too large!)之后,我决定用 PHP 编写有问题的代码。

在我的例子中,它被证明比 Java 更便携。

于 2014-06-09T11:23:20.323 回答