Could not initialize class com.amazonaws.partition

2020-02-12 05:36发布

问题:

Using Eclipse Mars .I have already added aws java sdk 1.11.123 through install software from help.Now when i run Tomcat Server 7 I get this error:

May 02, 2017 11:57:32 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [PdsServlet] in context with path [/PdsAWS] threw exception [java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.partitions.PartitionsLoader] with root cause java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.partitions.PartitionsLoader

I also get

java.lang.NoSuchFieldError: ALLOW_FINAL_FIELDS_AS_MUTATORS

But when i check library i can see PartitionsLoader.How can this be resolved?

More errors which seem related:

May 03, 2017 9:39:04 AM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.partitions.PartitionsLoader
	at com.amazonaws.regions.RegionMetadataFactory.create(RegionMetadataFactory.java:30)
	at com.amazonaws.regions.RegionUtils.initialize(RegionUtils.java:64)
	at com.amazonaws.regions.RegionUtils.getRegionMetadata(RegionUtils.java:52)
	at com.amazonaws.regions.RegionUtils.getRegion(RegionUtils.java:105)
	at com.amazonaws.services.s3.AmazonS3Client.createSigner(AmazonS3Client.java:3428)
	at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4156)
	at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4116)
	at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1700)
	at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1563)
	at com.tradingtechnologies.pdsawssql.aws.s3.S3HealthCheck.put(S3HealthCheck.java:83)
	at com.tradingtechnologies.pdsawssql.aws.s3.S3HealthCheck.put(S3HealthCheck.java:56)
	at com.tradingtechnologies.pdsawssql.aws.s3.S3HealthCheck.execute(S3HealthCheck.java:116)
	at com.tradingtechnologies.pdsawssql.sql.ext.HealthCheck.execute(HealthCheck.java:54)
	at com.tradingtechnologies.pdsservlet.HealthServlet.doGet(HealthServlet.java:31)
	at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
	at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
	at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
	at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
	at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
	at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
	at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at com.tradingtechnologies.pdsservercommon.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:24)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

回答1:

java.lang.NoSuchFieldError: ALLOW_FINAL_FIELDS_AS_MUTATORS

This makes it sound like you're picking up an old version of Jackson from somewhere. PartitionsLoader references MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS while initializing a static member field. If the version of MapperFeature that you pick up at runtime does not have this field, the resulting exception will cause the class initialization process for PartitionsLoader to fail. Subsequent attempts to reference the class will then throw the exception you're seeing.

ALLOW_FINAL_FIELDS_AS_MUTATORS was added in version 2.2. Which version are you picking up?



回答2:

Tomcat has its own file for dependencies. It is possible to configure the build path in Eclipse AND not add the dependencies to Tomcat for the build/deploy which could cause Java to throw that error.

Recreate your project as a dynamic web project in Eclipse (Check the documentation on how to do that if you're not familiar). Then include any 3rd party jars or libs in the auto-generated 'WEB-INF/lib' folder in addition to the build path necessary to run from source in Eclipse (aka the way you're doing it now). Then when you're ready to deploy, export to a war file and all the necessary libs in the 'WEB-INF/lib' folder will be visible to your compiled source.



回答3:

Ok, I have faced the same dependency hell challenge and took long time to cleanup. Below are my set of dependencies which need to be made in sync -

  • Rule of thumb : Always use same aws sdk dependency version (core/s3/ec2 etc)
  • Make other dependency (used by aws) consistent across your project.
  • This included the following for me
    • commons-http clash with http-client used by AWS
    • Remove commons-http, use consistent http-client and http-core version
    • clashing fasterxml.jackson libraries. Use consistent verison used by aws.
      • This includes about 4 jars (jackson-databind, core, annotations, cbor)