1

このエラーに関して多くの質問があることは知っていますが、私のようなものを見つけるのは簡単ではありません。

ここに行きます。

DBデータをcsvファイルに書き込んでからサーバーにアップロードする非常に小さなアプリケーションがあります。Eclipseからローカルボックスで実行していますが、最終バージョンはコマンドラインからサーバーボックスでcronジョブとして実行する必要があります。

私はメインのJavaクラスのコマンドライン呼び出しに取り組んでおり、それは私に多くの問題を与えています。

私の依存関係の構造は次のとおりです。私のクラス

  • package = gtechReconcile
  • classes = GtechReconciler.java、CSVFile.java、QueryMachine.java、FTPSender.java

私の外部ライブラリ

  • ojdbc14.zip
  • edtftpj.jar

コンパイルソースパッケージの上のディレクトリ(つまり、/ path / to / classes /gtechReconcile/にすべてのコンパイル済みクラスファイルがある/path/ to / classes)のターミナルで次の行を実行します。このパスは、コマンドが実行されたときの現在のディレクトリです。行が実行されます:

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

このエラーは、コードにjava.lang.StringBuilderが存在しない場合でも、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を作成すると、例外が発生します。Googleによると、GCJで頻繁に問題が発生するため、公式のSunJVMを使用してください。通常、この種の問題を解決します。


このフォルダーには、パッケージgtechReconcile内のすべてのクラスファイルが含まれていると見なされます。gtechReconcile

たとえば、がある場合、/path/to/classes/gtechReconcile/GtechReconciler.class2つのオプションがあります。

  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 に答える