2

これが私が得ているエラーです:

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;

クラスを逆コンパイルした後、最初のパラメーターとして「Ljava/lang/String」が必要であることがわかりました。エラーでわかるように、パラメーターがありません。したがって、呼び出し元のメソッドのクラスを逆コンパイルすると、最初のパラメーターとして文字列が含まれます。

ここで何が起こっているのか、私は少し混乱しています。タイムスタンプによると、このコードが最後に変更されたのは 2007 年でした。このエラーは約 1 週間前に表示されました。

これは、JBoss 4.0.0DR3 で実行される Struts アプリです。私の知る限り、サーバーにソフトウェアのアップグレードはありません。

また、JBoss を停止し、すべての一時ディレクトリを削除して再起動しようとしました。

次のステップへの提案はありますか?

編集:

ここにスタックトレースの詳細があります

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;
    at com.ViewStatusAction.retrieveList(ViewStatusAction.java:325)
    at com.ViewStatusAction.executeAction(ViewStatusAction.java:115)
    at com.BaseAction.execute(BaseAction.java:42)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
4

2 に答える 2

6

と の両方がサードパーティのコードではなく、アプリケーション コードであるcom.Orderと想定しています。com.ViewStatusAction

例外は、何らかのバージョンの不一致があることを意味します。

  • このクラスは、次のシグネチャViewStatusActionを持つメソッドがあることを期待しています。Order

    java.util.ArrayList getList(Lepo.User arg0, 
                                String arg1, String arg2, 
                                String arg3, String arg4)
    
  • クラスは、そのOrderシグネチャを持つメソッドを宣言していません。(署名が異なるか、まったく存在しない可能性があります。)

最初に をコンパイルしたときViewStatusAction、コンパイラはそのメソッドを見つけることができました。しかし、現在、ランタイム システムはそれを見つけることができません。Orderこれは、ViewStatusActionクラスがコンパイルされたバージョンとは異なるバージョンの を使用していることを意味するだけです。

この不一致が生じた理由を突き止める必要があります。考えられる説明は次のとおりです。

  • 他のクラスの新しいバージョンをデプロイせずに、クラスの 1 つの新しいバージョンをデプロイしました。

  • いずれかのクラスの古いバージョンをデプロイしました。

  • クラスパスにいずれかのクラスの 2 つのバージョンがあり、意図せずにクラスパスの検索順序を変更しました。

あなたがしなければならないことは、互換性のないクラスがどこから来て、どのようにしてそこに到達したかを見つけることです。それを理解したら、修正は自明である可能性があります。


あなたの FQ クラス名は、受け入れられている標準に準拠していないことに注意してください。

  1. パッケージ名は、組織のドメイン名を逆にして開始する必要があります。「コム」間違っている。
  2. パッケージ名はすべて小文字にする必要があります。「Lepo」はパッケージ名なら間違いだし、デフォルトパッケージのクラスならそれも間違い。

(あなたの問題は、偽の名前を修正することのフォールアウトである可能性がありますLepo.User...)

于 2012-10-16T02:40:47.493 に答える
0

おそらく、ランタイム jar は、コードのコンパイルに使用する jar とは異なります。同じクラスを含み、互いにシャドウしているクラスパスに複数の jar がある場合もあります。アプリ サーバーのランタイム クラスパスと jar の順序を確認することをお勧めします。

于 2012-10-16T02:30:18.537 に答える