我有一个使用Maven的Spring Boot应用程序。它构建得很好,除了在单个EC2实例上,胖罐子出了问题。基本上它会以错误的顺序注册bean,以便Spring最终使用全局配置bean覆盖我的自定义配置bean并吹走我的安全设置。
这种情况绝对奇怪,只有当jar在这台机器上构建时才会发生这种情况。我可以在任何其他机器,Windows,OS X,在Windows上运行的Linux VM,在Docker容器内运行的maven等构建应用程序的jar,这些jar在任何地方都可以正常工作 - 甚至在生成坏罐的机器上也是如此。但是从这个"坏" EC2实例将在每台其他计算机上运行错误,包括生成良好jar的计算机。
当应用程序启动时会出现实际错误,因为Spring会扫描类路径并注册bean定义。
2017-03-31 17:32:33,362 INFO [main] org.springframework.beans.factory.support.DefaultListableBeanFactory :
Overriding bean definition for bean 'methodSecurityInterceptor' with a different definition:
replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=methodSecurityConfig; factoryMethodName=methodSecurityInterceptor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/my-app/security/MethodSecurityConfig.class]]
with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; factoryMethodName=methodSecurityInterceptor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/security/config/annotation/method/configuration/GlobalMethodSecurityConfiguration.class]]
我的类实际上扩展了GlobalMethodSecurityConfiguration,因此Spring正在用它的父替换一个孩子。
如果类路径顺序可能因为看不见的东西而变得混乱,那么它似乎无法使用maven。我已经确定它在这台服务器上使用与其他机器相同版本的Maven,相同的java版本,甚至在该服务器上安装Oracle JDK以配合Oracle的麻烦Windows系统上的JDK。
当我排除操作系统,JDK和Maven版本差异时,还有什么想法可以搞砸罐子吗?这是从Git检出的相同代码。
编辑:我认为,通过指定扩展GlobalMethodSecurityConfiguration的配置类也是@Import(GlobalMethodSecurityConfiguration.class)并且这似乎迫使Spring调整顺序,我能够解决这个问题。至于存在差异的原因,我仍然处于亏损状态。我有一个理论认为,在重新打包期间Maven Spring Boot插件调用的不同zip实现创建了一个zip文件系统,文件的顺序错误但是打包文件的顺序不同,我的类仍然出现在Spring jar之前所以我不要以为可以解释。