はじめに
Aws を利用したアプリ(例えば、S3) をローカルで作成。
Eclipse を利用して動作確認をして、さあECS 上確認するぞ!といったところで、
java.lang.NoClassDefFoundError が発生。
java.lang.NoClassDefFoundError: com/amazonaws/services/s3/AmazonS3
実際にwar の中を確認すると、/WEB-INF/lib配下に、aws-java-ask-s3 が含まれていることを確認
これを解決する際に調べたことのメモ
結論
aws ask を含んだモジュールはスタンドアローンなjar ファイルではなく、スタンドアローンなwarファイルではない。
そのため、以下のプラグインをpom.xml に含める必要がある。
maven-shade-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<参考>
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html
※ 本家サイトのlambda サイトに記載あり
※ 2.3 のバージョンは最新ではないが、本家の記載に従っていたほうが無難。
補足
maven-shade-plugin
依存するライブラリ(jarファイル)を生成物のするjar内に含めることができるライブラリ。
利用すると、下記の2種類のjarファイルが生成される。
originalのprefix がついている方が、依存ライブラリを含んでいないjar ファイルで、容量に違いがみられる。(解凍すると、ディレクトリ構成が異なる)
xxx-1.0.0-SNAPSHOT
original-xxx-1.0.0-SNAPSHOT
詳細な公式ページは下記
https://maven.apache.org/plugins/maven-shade-plugin/
スタンドアローンなjar とは
※ スタンドアローンなjar の意味がわからなかったので忘備の調査記録
英語だと、下記。
standalone jar
stand alone で独り立ちできるjar ファイルというのが直接的な意味
わかりやすい日本語だと、実行可能jarファイルという意味。
スタンドアローンなjarは単体で実行できるjar。
スタンドアローンなjarではないことは、そのjarだけでは実行できないという意味になる。