1

私は完全に混乱しています。多数のカスタム Java クラスを含む jsp アプリケーションがあります。これまでは、開発環境で開発を行い、JAVA クラス、JSP ファイル、またはデータベース エントリを開発環境から本番環境に移行できました。(2 つの異なるサーバー。)

数日前、すべての JSP ファイルでコンパイル エラーが発生し始めました。一部のユニットにいくつかの小さな変更を加えましたが、JSP ファイルには加えていません。そこで、Tomcat を再起動して再試行しました。Apache と Tomcat の両方を再起動して、再試行しました。実稼働サーバーからクラスをコピーし、Tomcat を再起動して、再試行しました。開発サーバーで一貫してエラーが発生します。(私は何ヶ月もその構成に変更を加えていません。)

そこで、コンストラクターを介していくつかのクラスを開始するだけの簡単なテスト アプリケーションを作成しました。開発環境 (古いクラスまたは新しいクラスのいずれか) では失敗し、運用環境では完全に機能します。私のユニットの定義を取得する際にコンパイラによって使用されている CLASS ファイル (WEB-INF/classes/booknowservices/*.class) 以外の何かがあるかのようです。

たとえば、3 つのコンストラクターをテストします。

 /* --------- constructor definitions from JAVA source -----
 database:  Constructor:
     public BKDataServices (String currentHost)

 utilities:  Constructor: 
      public BKUtil (BKDataServices thisdatabase)

 textservices:    Constructor: 
      public BKTextServices(BKDataServices thisdatabase, BKUtil thisutilities) 
  --------------- */

 BKDataServices  database = new BKDataServices(serverName);
 BKUtil utilities = new BKUtil(database);
 BKTextServices pagetext = new BKTextServices(database,utilities);

コンパイルエラーが発生します

コンストラクター BKTextServices(BKDataServices, BKUtil) は未定義です

BKUtil の基になる定義が原因である可能性があるように見えます-パラメーターとして渡そうとすると、エラーも発生します。

//  Establish the link between the database class and the utilities class.
database.setUtilities(utilities);   
database.setUtilities((booknowservices.BKUtil)utilities);

タイプ BKDataServices のメソッド setUtilities(BKUtil) は引数 (BKUtil) には適用できません booknowservices.BKUtil から booknowservices.BKUtil にキャストできません

本番環境では (テストを含めて) すべてが機能するので、完全に停止しているわけではありませんが、自信を持って本番サーバーを更新できるように、開発システムを元に戻したいと考えています。

これを診断する方法についてのアイデアをいただければ幸いです。

問題を示す CompileTest.jsp を作成しました。共有する「空の」クラスはまだ作成していませんが、必要に応じて作成します。

ありがとう、

デイブ博士

4

1 に答える 1

1

古い JAR ファイルまたはクラス ファイルがクラスパスのどこかにあるようです。

問題のあるプログラムを追加の VM オプション-verbose:classで実行します。

`java -verbose:class Whatever.whatever`

これにより、VM はロード元のソースとともに、ロードしたすべてのクラスのダンプを出力します。特に、 と が期待どおりの場所から来ていることを確認してBKDataServicesくださいBKUtil

完全ではない代替手段は次のようなものです。

public static void printResource (Class<?> c) {
    String src;
    ClassLoader cl = c.getClassLoader();
    if (cl != null)
        src = cl.getResource(c.getName().replace('.', '/') + ".class").toString();
    else
        src = "[null ClassLoader]";
    System.err.println(c.getName() + " => " + src);
}

それで:

printResource(booknowServices.BKUtil.class);
printResource(BKDataServices.class);

など、クラスがロードされたソース .class ファイルが出力されるので、クラスが期待どおりであることを確認できます。null ClassLoader は、ブートストラップ クラス ローダーまたはプリミティブ型のいずれかであることを意味します。

于 2013-08-17T23:35:14.387 に答える