我在RHEL上运行第三方Java Spring应用程序,拒绝在从某个RHEL 6.5模板克隆的计算机上运行。 它只是在启动时死于一个假的例外(见下文)。
有问题的软件版本:
RHEL 6.5 Tomcat 7.0.41 (rolled our own, almost vanilla) Spring 3.1.4.RELEASE (shipped with application) java version "1.7.0_65" OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17) OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) SELinux Status: Permissive
我已经改变了类名来保护无辜,我非常怀疑实际的软件是重要的。
复制tomcat和实例目录从破碎的盒子到我的Linux桌面,并运行它。
虽然我所描述的设置被认为是一个testing环境,但我在我们的产品盒上遇到了这个问题,我不得不从DVD中安装,以使问题消失。 提到的设置是我在傀儡模块开发过程中重新遇到的问题,并设法保存和重现这个问题。
应用程序使用的DB保存在本地(h2),并在tomcat的server.xml中设置。
2个RHEL 6.5模板,都是为stream浪者设置的。
packer完成) 每个模板的1个盒子都是通过vagrant设置的,都是从我们的木偶大师那里应用完全相同的木偶目录。
该应用程序在启动时死于破碎的模板,但有以下例外情况:
[17.09.2014 19:34:00,290] ERROR ContextLoader ( 318) | Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'soaFormFolderService' defined in file [/var/www/apps/content/tomcat/afs-forms/webapps/formserver/WEB-INF/classes/com/aforms2web/afs/formserver/service/ SoaFormFolderService.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943) [...] Caused by: java.lang.ExceptionInInitializerError at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990) ... 26 more Caused by: java.lang.NullPointerException at com.corp.Application.getMessageSource(Application.java:234) at com.corp.FooService.<clinit>(FooService.java:23) ... 33 more
有问题的代码如下所示:
com.corp.FooService
@Service public class FooService { protected static MessageSource messageSource = Application.getInstance().getMessageSource();
com.corp.Application
public class Application { private static Application instance = null; public static Application getInstance() { if (instance == null) { instance = new Application(); } return instance; } [...] public MessageSource getMessageSource() { return ((MessageSource)this.applicationContext.getBean("messageSource", MessageSource.class)); }
它在第二个箱子里顺利运行。
什么可能导致这种情况发生?
diff风格yum list installed输出:
--- pkgs.broken +++ pkgs -b43-openfwwf.noarch-5.2-4.el6 -dkms.noarch-2.2.0.3-25.el6 -efibootmgr.x86_64-0.5.4-11.el6 +gcc-c++.x86_64-4.4.7-4.el6 -kernel-devel.x86_64-2.6.32-431.23.3.el6 +kernel-devel.x86_64-2.6.32-431.el6 -kernel.x86_64-2.6.32-431.23.3.el6 +libstdc++-devel.x86_64-4.4.7-4.el6 -puppet.noarch-3.7.0-1.el6 +puppet.noarch-3.7.1-1.el6
我用rsync(来自工作的)比较了系统:
rsync \ --checksum -ani \ --exclude log \ --exclude /vagrant \ --exclude /root \ --exclude /proc \ --exclude /sys \ --exclude /selinux \ --exclude /dev \ --exclude /lib/modules \ --exclude /usr/src \ --exclude /boot \ --delete / \ root@broken:/ \ | grep -ve "^." \ | grep -vEie "puppet|vbox|virtualbox|var/lib/yum|/var/run|sss|var/lib/rpm|logs"
在这里查看结果: http : //paste.ubuntu.com/8367930/
我无法弄清楚popup的变化可能会对Java Spring应用程序产生什么影响。
编辑 :瞥见在违规的代码添加。