我对 scala / java / sbt 相当陌生,这是我第一次调试通过 sbt 在“scala”中运行的代码与从编译的 jar 运行的相同代码之间的差异。我有一些 Scala 代码,它利用 AWS Java SDK 发出一些 S3 请求。当我使用 sbt 或 Intellij 在“Scala”中运行代码时,代码按预期成功。如果我使用 sbt 构建一个 fat jar 并使用该 jar 在“Java”中运行相同的代码,则代码会失败。我调试了失败并将其归因于拦截器链中缺少 ExecutionInterceptors:
// Logging the code ran from 'scala'
2022-12-21 14:09:33,861 [main] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Creating an interceptor chain that will apply interceptors in the following order:
[software.amazon.awssdk.core.internal.interceptor.HttpChecksumRequiredInterceptor@5965844d,
software.amazon.awssdk.core.internal.interceptor.SyncHttpChecksumInTrailerInterceptor@6d4a65c6,
software.amazon.awssdk.core.internal.interceptor.HttpChecksumValidationInterceptor@aa004a0,
software.amazon.awssdk.core.internal.interceptor.AsyncRequestBodyHttpChecksumTrailerInterceptor@4c98a6d5,
software.amazon.awssdk.core.internal.interceptor.HttpChecksumInHeaderInterceptor@392a04e7,
software.amazon.awssdk.awscore.interceptor.HelpfulUnknownHostExceptionInterceptor@7f02251,
software.amazon.awssdk.awscore.eventstream.EventStreamInitialRequestInterceptor@dffa30b,
software.amazon.awssdk.awscore.interceptor.TraceIdExecutionInterceptor@4d8126f,
software.amazon.awssdk.services.s3.internal.handlers.EnableChunkedEncodingInterceptor@6d3c232f,
software.amazon.awssdk.services.s3.internal.handlers.DisableDoubleUrlEncodingInterceptor@6b587673,
software.amazon.awssdk.services.s3.internal.handlers.EnableTrailingChecksumInterceptor@1bcf67e8,
software.amazon.awssdk.services.s3.internal.handlers.CreateMultipartUploadRequestInterceptor@5f404594,
software.amazon.awssdk.services.s3.internal.handlers.GetObjectInterceptor@53692008,
software.amazon.awssdk.services.s3.internal.handlers.ExceptionTranslationInterceptor@7b2a3ff8,
software.amazon.awssdk.transfer.s3.internal.ApplyUserAgentInterceptor@1bbae752,
software.amazon.awssdk.services.s3.internal.handlers.AsyncChecksumValidationInterceptor@460b6d54,
software.amazon.awssdk.services.s3.internal.handlers.EndpointAddressInterceptor@5cf87cfd,
software.amazon.awssdk.services.s3.internal.handlers.SignerOverrideInterceptor@76075d65,
software.amazon.awssdk.services.s3.internal.handlers.GetBucketPolicyInterceptor@3a4ba480,
software.amazon.awssdk.services.s3.internal.handlers.PutObjectInterceptor@27b71f50,
software.amazon.awssdk.services.s3.internal.handlers.SyncChecksumValidationInterceptor@383790cf,
software.amazon.awssdk.services.s3.internal.handlers.DecodeUrlEncodedResponseInterceptor@74971ed9,
software.amazon.awssdk.services.s3.internal.handlers.CreateBucketInterceptor@131fcb6f,
software.amazon.awssdk.services.s3.internal.handlers.CopySourceInterceptor@ccd1bc3]
// Logging the same code ran from 'java'
2022-12-21 14:15:06,281 [main] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Creating an interceptor chain that will apply interceptors in the following order:
[software.amazon.awssdk.core.internal.interceptor.HttpChecksumRequiredInterceptor@147e2ae7,
software.amazon.awssdk.core.internal.interceptor.SyncHttpChecksumInTrailerInterceptor@448c8166,
oftware.amazon.awssdk.core.internal.interceptor.HttpChecksumValidationInterceptor@4470fbd6,
software.amazon.awssdk.core.internal.interceptor.AsyncRequestBodyHttpChecksumTrailerInterceptor@15d49048,
software.amazon.awssdk.core.internal.interceptor.HttpChecksumInHeaderInterceptor@7098b907,
software.amazon.awssdk.awscore.interceptor.HelpfulUnknownHostExceptionInterceptor@503f91c3,
software.amazon.awssdk.awscore.eventstream.EventStreamInitialRequestInterceptor@13526e59,
software.amazon.awssdk.awscore.interceptor.TraceIdExecutionInterceptor@2235eaab,
software.amazon.awssdk.transfer.s3.internal.ApplyUserAgentInterceptor@17503f6b]
该类型的所有拦截器software.amazon.awssdk.services.s3.internal.handlers
jar 中运行的代码中缺少这些内容。
我不确定这是否有直接关系。我的build.sbt
有以下合并策略:
assembly / assemblyMergeStrategy := {
// Don't discard Geotools META-INF service files
case PathList("META-INF", xs @ _*) =>
(xs map { _.toLowerCase }) match {
case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) =>
MergeStrategy.discard
case ps @ (x :: xs) if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") =>
MergeStrategy.discard
case "plexus" :: xs =>
MergeStrategy.discard
case "services" :: xs =>
MergeStrategy.filterDistinctLines
case ("spring.schemas" :: Nil) | ("spring.handlers" :: Nil) =>
MergeStrategy.filterDistinctLines
case _ => MergeStrategy.discard
}
case PathList("reference.conf", xs @ _*) => MergeStrategy.concat
case PathList("version.conf", xs @ _*) => MergeStrategy.concat
case x => MergeStrategy.first
},
当调试编译我的 jar 时sbt assembly
我注意到这一行:[debug] Merging 'software/amazon/awssdk/services/s3/execution.interceptors' with strategy 'first'
这与我缺少拦截器的原因有关吗?或者可能还有其他原因导致缺少这些处理程序,例如缺少依赖项?