tocoma

Just another サイト 外の家 site

*

クロスプラットホームプッシュ通知で発生したNoClassDefFoundError対策

   


珍しくプログラムについての投稿
これまで何の問題も無く動作していたAPNSのプッシュ通知がある日

java.lang.NoClassDefFoundError: Could not initialize class com.notnoop.apns.PayloadBuilder
at com.notnoop.apns.APNS.newPayload(APNS.java:48)
at com.company.xxx.service.YYYY.sendAPNSMessage(hogehoge.java:1489)

のエラーを吐いて悩んだ話。
APNSはlib下に置いたapns-0.2.3.jarを使用
hogehoge.java 1489行は

                  PayloadBuilder payloadBuilder = APNS.newPayload();

のみで特に問題ない。更にnewPayload()は

public final class APNS {
…… 略 …..
    public static PayloadBuilder newPayload() {
        return new PayloadBuilder();
    }

単にnew PlayloadBuilder()してるだけでやっぱり問題ない。

デバッガーで進めて見るとAPNS.newPayload()からいきなり

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
とExceptionに入りNoClassDefFoundErrorと成ってる。謎?

PayloadBuilder は下の様な感じで

public final class PayloadBuilder {
    private static final ObjectMapper mapper = new ObjectMapper();
    private final Map<String, Object> root;
    private final Map<String, Object> aps;
    private final Map<String, Object> customAlert;
    /**
     * Constructs a new instance of {@code PayloadBuilder}
     */
    PayloadBuilder() {
        root = new HashMap<String, Object>();
        aps = new HashMap<String, Object>();
        customAlert = new HashMap<String, Object>();
    }

PayloadBuilder()のコンストラクタでブレークポインタ置いても入って来ない。

どこで落ちてんだ?と思い。
試しに

    private static final ObjectMapper mapper = new ObjectMapper();

にブレークポインタを置くと止まった。
Java って静的メンバーの確保行でもブレークポインタ貼れるんだね。
知りませんでした。

ObjectMapperに原因あるかと思って宣言辿ると

public class com.google.appengine.repackaged.org.codehaus.jackson.map.ObjectMapper extends com.google.appengine.repackaged.org.codehaus.jackson.ObjectCodec implements com.google.appengine.repackaged.org.codehaus.jackson.Versioned {

って成ってて、ObjectMapperってjackson使ってたんですね。

jacksonって言えばlibの下に

jackson-annotations-2.6.3.jar
jackson-core-2.6.3.jar
jackson-databind-2.6.3.jar

などがあって今まで動いてた筈なのに???

と思ってlib周りを調べるとWEB-INF/lib下に

jackson-core-2.1.3.jar

が増えていました。

よくよく原因を調べると
Androidのプッシュ通知機能も併用してるので

Google Play Android Developer API

(最新版だと Google Play Developer API )

も登録してたのでそこにjackson-core-2.1.3.jarが入ってて
WEB-INFに登録されてた模様。

jackson-core-2.6.3.jar

との優先を調整してみたりいろいろやりましたが
両方使うのは無理っぽいし

Google Play Developer APIを編集する訳にもいかないから

jackson-annotations-2.6.3.jar
jackson-core-2.6.3.jar
jackson-databind-2.6.3.jar

を使うのは諦めて削除し代わりに

jackson-annotations-2.1.2.jar
jackson-databind-2.1.3.jar

をWEB-INF/libにダウングレード登録し

apns-0.2.3.jar

も間際らしいので libからWEB-INF/libに移動

実行してみると動作OK!

暫くはこれで凌ぐ方が良さそうですね。

 - 未分類