1

我知道有很多关于这个错误的问题,但我发现找到一个和我一模一样的问题并不容易。

开始。

我有一个非常小的应用程序,它将数据库数据写入 csv 文件,然后将其上传到服务器。我让它在我的本地机器上运行,这很棒,但最终版本需要从命令行作为服务器机器上的 cron 作业运行。

我正在处理主要 java 类的命令行调用,这给我带来了很多麻烦。

我的依赖结构是这样的:我的类

  • 包=gtechReconcile
  • 类= GtechReconciler.java、CSVFile.java、QueryMachine.java、FTPSender.java

我的外部库

  • ojdbc14.zip
  • edtftpj.jar

我在终端编译源码包上面的目录下运行下面一行(即/path/to/classes 其中/path/to/classes/gtechReconcile/有所有编译好的class文件)这个路径是命令时的当前目录线路运行:

java -cp /<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/path/to/classes gtechReconcile.GtechReconciler

然后错误告诉我它找不到 java.lang.StringBuilder,即使这在我的代码中不存在。我使用 StringBuffer,显然 StringBuilder 自 Java5 以来已被替换。也许 java 编译器将其转换为 StringBuilder,然后 jvm 无法解析?

我在这里想念什么?

编辑:从提示中添加了错误(澄清了从哪里执行以及包文件夹中存在什么):

[gtechReconcile]$ pwd
/path/to/
[gtechReconcile]$ cd classes/gtechReconcile/
[gtechReconcile]$ ls
CSVFile.class  FTPSender.class  GtechReconciler.class  QueryMachine.class  reports
[gtechReconcile]$ cd ..
[classes]$ ls
gtechReconcile
[classes]$ java -cp .:/path/to/lib/ojdbc14.zip:/path/to/lib/edtftpj.jar gtechReconcile.GtechReconciler
Creating file
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class: gtechReconcile.CSVFile
at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at java.lang.Class.initializeClass() (/usr/lib/libgcj.so.5.0.0)
at gtechReconcile.GtechReconciler.main(java.lang.String[]) (Unknown Source)
Caused by: java.lang.ClassNotFoundException: java.lang.StringBuilder not found in [file:./, file:/opt/mms_tstt2/gtechReconcile/lib/ojdbc14.zip, file:/opt/mms_tstt2/gtechReconcile/lib/edtftpj.jar, file:/usr/share/java/libgcj-3.4.6.jar, file:./, core:/]
at java.net.URLClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.5.0.0)
at gnu.gcj.runtime.VMClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.5.0.0)
at java.lang.ClassLoader.loadClass(java.lang.String, boolean) (/usr/lib/libgcj.so.5.0.0)
at _Jv_FindClass(_Jv_Utf8Const, java.lang.ClassLoader) (/usr/lib/libgcj.so.5.0.0)
at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib/libgcj.so.5.0.0)
at _Jv_BytecodeVerifier.verify_instructions_0() (/usr/lib/libgcj.so.5.0.0)
at _Jv_VerifyMethod(_Jv_InterpMethod) (/usr/lib/libgcj.so.5.0.0)
at _Jv_PrepareClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at _Jv_WaitForState(java.lang.Class, int) (/usr/lib/libgcj.so.5.0.0)
at java.lang.VMClassLoader.linkClass0(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib/libgcj.so.5.0.0)
...2 more
4

2 回答 2

2

在 CSVFile 类中创建新的 StringBuilder 时会引发异常。谷歌告诉我这是 GCJ 的一个常见问题,使用官方的 Sun JVM。它通常可以解决此类问题。


gtechReconcile假定该文件夹包含gtechReconcile包中的所有类文件。

例如,如果你有/path/to/classes/gtechReconcile/GtechReconciler.class,你有两个选择。

  1. 转到,将当前目录 ( )/path/to/classes添加到类路径并像以前一样运行。.java
  2. 添加/path/to/classes到类路径并在java任何你喜欢的地方运行。
于 2010-06-21T17:17:20.940 回答
1

默认的类路径(如果你没有指定的话)是当前目录(“.”)。

但是,如果您指定类路径,java 将使用该路径而不是默认路径,从而删除当前目录。

解决您的问题的方法很简单:将“当前目录”添加到您的类路径中,例如:

java -cp .:/<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/<snip>/bin/ gtechReconcile.GtechReconciler
于 2010-06-21T17:15:34.290 回答