[小ネタ] Talend でルーチンの参照ライブラリを変更した時にハマった話

こんにちは!インテグレーション部の大高です。

Talendではルーチン内のコードで外部ライブラリを利用したい場合に、右クリックから追加でjarを指定することができます。

詳しくは以下の記事をご参照ください。

[Talend]ルーチンを利用してJavaのコードを書く

今回はこのライブラリを安易に変更した際に起こったことのご紹介です。

起きたこと

以下のようなプロファイル名からアクセスキーとシークレットキーを取得するようなコードをTalendのルーチンで利用していたのですが、先日ルーチンの参照ライブラリを「aws-java-sdk-core-1.10.56.jar」から「aws-java-sdk-1.11.406.jar」に変更した際にNoClassDefFoundError エラーが発生していることに気付きました。

※なお、理想としてはIAMロールの利用が理想です。

NoClassDefFoundError を潰すため、jarファイルを1つずつ追加して対応しましたが、結果としては想定以上に参照ライブラリが必要となりました。

package routines;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;

public class AWSCredentialUtil {

    private static AWSCredentialsProvider provider;

    static {
        provider = new ProfileCredentialsProvider("SomeProfileName");
    }

    public static String getAccessKeyId() {
        try {
            provider.getCredentials();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
        return provider.getCredentials().getAWSAccessKeyId();
    }

    public static String getAWSSecretKey() {
        try {
            provider.getCredentials();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
        return provider.getCredentials().getAWSSecretKey();
    }
}

対応した結果

発生する NoClassDefFoundError を潰し続けて、最終的に必要となったのは以下でした。

aws-java-sdk-1.11.406.jar
commons-logging-1.2.jar
jackson-core-2.9.9.jar
jackson-annotations-2.9.0.jar
jackson-databind-2.9.9.jar
joda-time-2.9.jar
httpcore-4.4.9.jar
httpclient-4.5.5.jar

これらを追加した結果が、以下のような感じです。

まとめ

ルーチンの参照ライブラリ変更時には、十分な検証が必要ですね。もし似たようなコードを書かれている場合にはご注意ください。

どなたかのお役に立てば幸いです。それでは!