Apache beamとFlinkを組み合わせてjavaが現れる.lang.NoClassDefFoundError問題解決!

2703 ワード

問題:ローカルSTSでFlinkを実行する場合に発生する問題について説明します.
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/runtime/state/AbstractStateBackend
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
	at java.lang.Class.privateGetPublicMethods(Unknown Source)
	at java.lang.Class.getMethods(Unknown Source)
	at sun.misc.ProxyGenerator.generateClassFile(Unknown Source)
	at sun.misc.ProxyGenerator.generateProxyClass(Unknown Source)
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)
	at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)
	at java.lang.reflect.WeakCache$Factory.get(Unknown Source)
	at java.lang.reflect.WeakCache.get(Unknown Source)
	at java.lang.reflect.Proxy.getProxyClass0(Unknown Source)
	at java.lang.reflect.Proxy.getProxyClass(Unknown Source)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.validateWellFormed(PipelineOptionsFactory.java:1759)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.validateWellFormed(PipelineOptionsFactory.java:1704)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.register(PipelineOptionsFactory.java:1699)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.initializeRegistry(PipelineOptionsFactory.java:1687)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.(PipelineOptionsFactory.java:1673)
	at org.apache.beam.sdk.options.PipelineOptionsFactory$Cache.(PipelineOptionsFactory.java:1638)
	at org.apache.beam.sdk.options.PipelineOptionsFactory.resetCache(PipelineOptionsFactory.java:534)

 java.lang.NoClassDefFoundErrorとClassNotFoundExceptionの2つは違います.
NoClassDefFoundErrorはここでpomが引用したときにtestを削除しなかったため

			org.apache.flink
			flink-runtime_2.11
			1.5.2
			test
		

ClassNotFoundExceptionは一般的にjavaパッケージが少ないため
ここでお話しします.
scopeの分類
1.compile:デフォルトでは、依存するプロジェクトは現在のプロジェクトのコンパイルに参加する必要があり、後続のテストがあり、実行サイクルも参加し、比較的強い依存であることを示しています.パッケージには通常含まれる必要があります
2.test:依存項目は、テストコードのコンパイルと実行を含むテスト関連の作業にのみ参加し、パッケージ化されません.例えば、junit
3.runtime:依存するプロジェクトはプロジェクトのコンパイルに参加する必要はありませんが、後期のテストと実行サイクルには参加する必要があります.compileに比べてコンパイルをスキップしただけです.例えばJDBCドライバ、実行とテストフェーズに適用
4.provided:梱包するときは包まなくてもいいです.他の施設が提供します.実際,この依存は理論的にコンパイル,テスト,実行などの周期に関与することができる.compileに相当しますが、パッケージフェーズでexclude操作を行いました.
5.system:参加度から言えばprovidedと同じですが、依存項目はmaven倉庫からダウンロードするのではなく、ローカルファイルシステムから取得します.システムPathのプロパティを追加してパスを定義する必要があります