4

私は自分で作成したjarの中にEnumを持っています。この jar は、enum 値を使用する 2 番目の jar の依存関係です。

ここで、2 番目の jar はロギング フレームワークですが、この場合の最初の jar はロギング フレームワークのモデル クラスです。

このロギング フレームワークを、作成した Web アプリケーションに実装しようとしています。簡単に言えば、まだ作業が必要ですが、1 つの問題で立ち往生しています。フレームワークの構成初期化でのエラーは例外としてキャッチされ、メソッドが呼び出されます。このメソッドには、パラメーターの 1 つとして Enum 値があります。ただし、この列挙型で java.lang.NoSuchFieldError が発生します。

Enum 値が ERROR だったので、偶然かもしれないと考えました。しかし、BABYLOVE に変更すると、エラー メッセージも変更されました。

クラス/列挙名の冗長性や重複の可能性をチェックしましたが、見つけることができるものはありません。

注文の順序:

  1. ロギング フレームワークの初期化のための Web アプリ呼び出し (直接依存)
  2. logging-framework には独自の構成の読み込みに問題があり、例外がスローされます
  3. 例外が処理され、メソッドが呼び出されてエラーが登録されます
  4. メソッドはいくつかのパラメーターで呼び出されます。1 つは logging-framework-model.jar からの列挙値であり、Web アプリの推移的な依存関係です。
  5. Web アプリが例外をスローする

    java.lang.NoSuchFieldError: BABYLOVE
    at logging.framework.Constants.<clinit>(Constants.java:52)
    at logging.framework.Logger.<init>(Logger.java:60)
    at logging.framework.LogContext.getLoggerFromContext(LogContext.java:95)
    at logging.framework.LogContext.getCurrent(LogContext.java:48)
    at action.navigation.CalendarElementEditorAction.execute(CalendarElementEditorAction.java:39)
    Truncated. see log file for complete stacktrace
    

定数、51 ~ 52 行目:

public static final Event ConfigValidationFailed = 
EventLogHelper.getEvent(EventLogSource.LoggingFramework, EventLogEntryType.BABYLOVE");

EventLogEntryType:

@XmlType(name = "EventLogEntryType")
@XmlEnum
public enum EventLogEntryType {

//for test purposes, should be removed. This variable is given a name that can not be confused with standard names in error messages, like Error and Warning can.
@XmlEnumValue("BabyLove")
BABYLOVE("BabyLove"),

@XmlEnumValue("Error")
ERROR("Error"),
@XmlEnumValue("Warning")
WARNING("Warning"),
@XmlEnumValue("Information")
INFORMATION("Information"),
@XmlEnumValue("SuccessAudit")
SUCCESSAUDIT("SuccessAudit"),
@XmlEnumValue("FailureAudit")
FAILUREAUDIT("FailureAudit");



private final String value;

EventLogEntryType(String v) {
    value = v;
}

public String value() {
    return value;
}

public static EventLogEntryType  fromValue(String v) {
    for (EventLogEntryType c: EventLogEntryType .values()) {
        if (c.value.equals(v)) {
            return c;
        }
    }
    throw new IllegalArgumentException(v);
}

それが問題かどうかはわかりませんが、maven2 を使用して依存関係を処理しています。

4

1 に答える 1

1

依存関係のバージョンに不一致があるかどうかを確認するように言われ、戦争の内容を確認したところ、それが問題であることがわかりました。

私の webapp は、いくつかの基本モデルとビジネス ロジック クラスを含む jar に依存している 2 つの非常によく似たもののうちの 1 つです。以前に、そのプロジェクトの pom.xml にロギング フレームワーク (バージョン 1) を追加しました。そのため、ロギング フレームワーク 1.0 は Web アプリの推移的な依存関係でしたが、ロギング フレームワーク 2.0 は Web アプリの直接的な依存関係でした。直接的な依存関係は推移的な依存関係よりも優先されると推測しているため、2.0 が私の戦争にパッケージ化されたものでした。ただし、ロギング フレームワークはフレームワーク (直接的な依存関係) と一連のモデル クラス (推移的な依存関係) で構成されるため、war はロギング フレームワーク モデル バージョン 1.0 にパッケージ化されました。

戦争を解凍してこれを見つけた後、間違ってインポートされた場所を見つけるのは非常に簡単なプロセスであり、完全なセットのフレームワーク バージョン 2.0 のみをログに記録することになりました。

于 2015-01-15T10:22:55.827 に答える