ローカルで「mvn clean install」を使用してデプロイを行うと正常に動作するスプリングブートアプリがありますが、Jenkinを介して戦争が生成されると、次のエラーがスローされます。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectMapper' defined in class path resource [com/test/common/TestRestConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.databind.ObjectMapper]: Factory method 'objectMapper' threw exception; nested exception is Java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:599)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.Java:1123)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.Java:1018)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.Java:1192)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:1116)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:1014)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.Java:545)
... 62 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.databind.ObjectMapper]: Factory method 'objectMapper' threw exception; nested exception is Java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:588)
... 74 common frames omitted
Caused by: Java.lang.NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.SerializationConfig
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.Java:535)
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.Java:452)
Beyond compareを使用して2つのwarファイルを比較しようとしましたが、コンパイルに使用されているJDKマイナーバージョン以外の差分は表示されません。
ローカルビルドとjenkinビルドでSerializationConfig.classを検索しようとしましたが、
以下のコマンドの出力は、
find . -type f -name '*.jar' -print0 | xargs -0 -I '{}' sh -c 'jar tf {} | grep SerializationConfig.class && echo {}'
ローカル戦争O/P:-
com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar
ジェンキン戦争O/P:-
com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar
基本的に、次のようにTestRestConfigurationクラスにObjectMapperを注入します。
@Inject
private ObjectMapper objectMapper;
Jenkinを介して生成されたwarファイルが問題を引き起こしている理由は不明です。
これに関する助けをいただければ幸いです。
2つの異なるjarファイルの依存関係から同じクラス(SerializationConfig)をプルしているようです。あなたの質問から、com.fasterxml.jackson.databind(スタックトレースで引用)の1つがjackson-databind-2.7.3.jarまたはjersey-all-2.18.jarのいずれかにあることは明らかです。 :
com/fasterxml/jackson/databind/SerializationConfig.class
./jackson-databind-2.7.3.jar
org/codehaus/jackson/map/SerializationConfig.class
./jackson-mapper-asl-1.9.13.jar
com/fasterxml/jackson/databind/SerializationConfig.class
./jersey-all-2.18.jar
私はまず、jackson-databind-2.7.3.jarまたはjersey-all-2.18.jarのいずれか一方に依存するように依存関係を削減しようとしますが、両方には依存しません。アプリケーションがいずれかで動作する場合、これで問題が解決すると思われます(ただし、Springの「タイプの一意のBeanは定義されていません...」というメッセージが表示されることはあると思いますが、気づきませんでしたあなたの投稿で)。
とにかく、私が正しいなら、あなたが見ているのは、ローカル環境で発生するクラスロードのアーティファクトとJenkins生成のアーティファクトで発生し、サーバーに展開されるアーティファクトです(ここで追加の複雑さ-提供されたライブラリについてサーバーを精査し、クラスのロードが行われている順序を正確に理解します。
JacksonのSerializationConfigクラスの ソースコード を覗いてみると、次のことがわかります。2つの異なるjarファイルのクラスが実際には同一でない場合、興味深いことがあります。
private static final long serialVersionUID = 1
それが役に立てば幸い。幸運を!
編集1:
TomcatやJettyなどの組み込みサーバーで、いわゆる「ファットjar」ファイルを生成するビルドのペアをセットアップするのは興味深いかもしれません。ローカルで生成したものとジェンキンスで生成したものの動作を比較すると、そこから何かを学ぶかもしれません。同じ問題が見られますか?ファットjarファイルを使用すると、既存の(および事前に構成された、変更可能な)コンテナーにデプロイする場合よりも、デプロイされた環境をより明確に制御できます。
編集2:
環境の違いを把握するために役立つことがいくつかあります。
mvn dependency:tree
または、多くの忍耐がある場合
mvn -X
ジェンキンスはビルドをクリーンアップしますか?つまり、「mvn install」だけでなく「mvn clean install」を呼び出しますか?ローカルで「mvn clean install」を使用すると、例外が消え、アプリが正常に起動します。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.4</version>
</dependency>