我知道有很多关于这个错误的问题,但我发现很难找到一个与我一样的错误。
到此为止。
我有一个非常小的应用程序,它将DB数据写入csv文件,然后将其上传到服务器。我把它运行在我的本地盒子里,这是很好的,但最终版本需要从命令行作为服务器盒上的cron作业运行。
我正在为主java类进行命令行调用,这给我带来了很多麻烦。
我的依赖结构是这样的: 我的课程
我的外部文件库
我在编译源包上面的目录中运行以下行(即/ path / to / classes其中/ path / to / classes / gtechReconcile /包含所有已编译的类文件)此路径是当前目录运行命令行时:
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
答案 0 :(得分:2)
在CSVFile类中创建新的StringBuilder时会引发异常。谷歌告诉我这是GCJ的一个常见问题,使用官方的Sun JVM。它通常可以解决这类问题。
假设gtechReconcile
文件夹包含gtechReconcile
包中的所有类文件。
例如,如果您有/path/to/classes/gtechReconcile/GtechReconciler.class
,则有两种选择。
/path/to/classes
,将当前目录(.
)添加到类路径中,并像之前一样运行java
。/path/to/classes
添加到类路径中,并在任意位置运行java
。答案 1 :(得分:1)
默认的类路径(如果没有指定)是当前目录(“。”)。
但是,如果指定类路径,java将使用该路径而不是默认路径,从而删除当前目录。
解决问题的方法很简单:将“当前目录”添加到类路径中,例如:
java -cp .:/<snip>/lib/ojdbc14.zip:/<snip>/lib/edtftpj.jar:/<snip>/bin/ gtechReconcile.GtechReconciler