티스토리 뷰
Tomcat에서 Jeus로 웹서버 변경 중 org.apache.el.ExpressionFactoryImpl를 찾지 못할 경우
hihoyeho 2014. 8. 1. 16:00Tomcat 6.0에서 Spring Framework 3.1로 개발 된 웹 어플리케이션을 Jeus 6.0으로 변환하는 작업을 해야 했다.
처음에는 Tomcat이나 Jeus나 똑같은 웹 서버인데 별 문제 있겠나 싶어서 소스 그대로 Jeus에 deploy 시켰지만
xxx-servlet.xml에 Tiles가 선언 된 부분에서 에러가 빵 발생하는 것이다.
- 소스 (xxx-servlet.xml)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <bean id="Tiles2ViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"></property> <property name="contentType" value="text/html; charset=UTF-8"></property> <property name="order" value="0"></property> </bean> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/Layout-Config.xml</value> </list> </property> </bean> | cs |
- 에러코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | javax.management.MBeanException: jeus.servlet.deployment.StartingException: WebContainerType start error at com.sun.jmx.mbeanserver.MBeanIntrospector.unwrapInvocationTargetException(MBeanIntrospector.java:283) at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:210) at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:120) at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:262) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) at jeus.management.JMXUtility.invokeWithTargetModuleID(JMXUtility.java:873) at jeus.server.enginecontainer.EngineContainer.deployRegisteredApp(EngineContainer.java:1420) at jeus.server.enginecontainer.EngineContainer.deployApp(EngineContainer.java:1327) at jeus.server.enginecontainer.EngineContainer.init(EngineContainer.java:501) at jeus.server.enginecontainer.EngineContainer.<init>(EngineContainer.java:213) at jeus.server.enginecontainer.EngineContainer.main(EngineContainer.java:1258) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at jeus.server.Bootstrapper.callMainMethod(Bootstrapper.java:718) at jeus.server.Bootstrapper.callMain(Bootstrapper.java:790) at jeus.server.enginecontainer.EngineContainerBootstrapper.main(EngineContainerBootstrapper.java:14) Caused by: jeus.servlet.deployment.StartingException: WebContainerType start error at jeus.servlet.engine.Context.doStart(Context.java:1311) at jeus.servlet.engine.Context.execStart(Context.java:1103) at jeus.management.j2ee.WebModule.preStart(WebModule.java:383) at jeus.management.j2ee.J2EEManagedObject.start(J2EEManagedObject.java:859) at jeus.management.j2ee.J2EEDeployedObject.start(J2EEDeployedObject.java:301) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93) at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27) at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208) ... 17 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tilesConfigurer' defined in ServletContext resource [/WEB-INF/Controller-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/el/ex-pressionFactoryImpl at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133) at javax.servlet.GenericServlet.init(GenericServlet.java:236) at jeus.servlet.loader.ServletReloader.doInitInstance(ServletReloader.java:70) at jeus.servlet.loader.PrivateReloader.initInstance(PrivateReloader.java:127) at jeus.servlet.loader.PrivateReloader.getInstance(PrivateReloader.java:91) at jeus.servlet.loader.ServletReloader.getServlet(ServletReloader.java:51) at jeus.servlet.engine.ServletWrapper.loadon-startup(ServletWrapper.java:105) at jeus.servlet.engine.ServletManager.doPreloadServlets(ServletManager.java:489) at jeus.servlet.engine.ServletManager.preloadServlets(ServletManager.java:453) at jeus.servlet.engine.Context.preloadServlets(Context.java:1689) at jeus.servlet.engine.Context.doStart(Context.java:1309) ... 28 more Caused by: java.lang.NoClassDefFoundError: org/apache/el/ex-pressionFactoryImpl at org.apache.tiles.evaluator.el.ELAttributeEvaluator.init(ELAttributeEvaluator.java:104) at org.apache.tiles.factory.TilesContainerFactory.storeContainerDependencies(TilesContainerFactory.java:444) at org.apache.tiles.factory.TilesContainerFactory.initializeContainer(TilesContainerFactory.java:368) at org.apache.tiles.factory.TilesContainerFactory.createTilesContainer(TilesContainerFactory.java:287) at org.apache.tiles.factory.TilesContainerFactory.createContainer(TilesContainerFactory.java:231) at org.apache.tiles.startup.BasicTilesInitializer.createContainer(BasicTilesInitializer.java:117) at org.apache.tiles.startup.BasicTilesInitializer.initialize(BasicTilesInitializer.java:53) at org.springframework.web.servlet.view.tiles2.TilesConfigurer.afterPropertiesSet(TilesConfigurer.java:339) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ... 53 more Caused by: java.lang.ClassNotFoundException: org.apache.el.ex-pressionFactoryImpl at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at jeus.servlet.loader.ContextLoader.findClass(ContextLoader.java:1561) at jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:1380) at jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:1310) ... 63 more Root Exception stack trace : jeus.servlet.deployment.StartingException: WebContainerType start error at jeus.servlet.engine.Context.doStart(Context.java:1311) at jeus.servlet.engine.Context.execStart(Context.java:1103) at jeus.management.j2ee.WebModule.preStart(WebModule.java:383) at jeus.management.j2ee.J2EEManagedObject.start(J2EEManagedObject.java:859) at jeus.management.j2ee.J2EEDeployedObject.start(J2EEDeployedObject.java:301) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93) at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27) at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208) at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:120) at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:262) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) at jeus.management.JMXUtility.invokeWithTargetModuleID(JMXUtility.java:873) at jeus.server.enginecontainer.EngineContainer.deployRegisteredApp(EngineContainer.java:1420) at jeus.server.enginecontainer.EngineContainer.deployApp(EngineContainer.java:1327) at jeus.server.enginecontainer.EngineContainer.init(EngineContainer.java:501) at jeus.server.enginecontainer.EngineContainer.<init>(EngineContainer.java:213) at jeus.server.enginecontainer.EngineContainer.main(EngineContainer.java:1258) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at jeus.server.Bootstrapper.callMainMethod(Bootstrapper.java:718) at jeus.server.Bootstrapper.callMain(Bootstrapper.java:790) at jeus.server.enginecontainer.EngineContainerBootstrapper.main(EngineContainerBootstrapper.java:14) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tilesConfigurer' defined in ServletContext resource [/WEB-INF/Controller-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/el/ex-pressionFactoryImpl at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133) at javax.servlet.GenericServlet.init(GenericServlet.java:236) at jeus.servlet.loader.ServletReloader.doInitInstance(ServletReloader.java:70) at jeus.servlet.loader.PrivateReloader.initInstance(PrivateReloader.java:127) at jeus.servlet.loader.PrivateReloader.getInstance(PrivateReloader.java:91) at jeus.servlet.loader.ServletReloader.getServlet(ServletReloader.java:51) at jeus.servlet.engine.ServletWrapper.loadon-startup(ServletWrapper.java:105) at jeus.servlet.engine.ServletManager.doPreloadServlets(ServletManager.java:489) at jeus.servlet.engine.ServletManager.preloadServlets(ServletManager.java:453) at jeus.servlet.engine.Context.preloadServlets(Context.java:1689) at jeus.servlet.engine.Context.doStart(Context.java:1309) ... 28 more Caused by: java.lang.NoClassDefFoundError: org/apache/el/ex-pressionFactoryImpl at org.apache.tiles.evaluator.el.ELAttributeEvaluator.init(ELAttributeEvaluator.java:104) at org.apache.tiles.factory.TilesContainerFactory.storeContainerDependencies(TilesContainerFactory.java:444) at org.apache.tiles.factory.TilesContainerFactory.initializeContainer(TilesContainerFactory.java:368) at org.apache.tiles.factory.TilesContainerFactory.createTilesContainer(TilesContainerFactory.java:287) at org.apache.tiles.factory.TilesContainerFactory.createContainer(TilesContainerFactory.java:231) at org.apache.tiles.startup.BasicTilesInitializer.createContainer(BasicTilesInitializer.java:117) at org.apache.tiles.startup.BasicTilesInitializer.initialize(BasicTilesInitializer.java:53) at org.springframework.web.servlet.view.tiles2.TilesConfigurer.afterPropertiesSet(TilesConfigurer.java:339) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ... 53 more Caused by: java.lang.ClassNotFoundException: org.apache.el.ex-pressionFactoryImpl at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at jeus.servlet.loader.ContextLoader.findClass(ContextLoader.java:1561) at jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:1380) at jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:1310) </init></init> | cs |
Jeus에서는 org.apache.el.ExpressionFactoryImpl를 찾지 못하고 에러를 발생시키는 것이다.
처음에는 Jeus에서 제공하는 el library와 Tomcat에서 제공하는 el library가 서로 상이해서 그런줄 알았다. 그래서
"웹 서버에 있는 library를 먼저 로딩하니 환경에 따라 에러가 발생된 것이다. web-inf/lib에 있는 library들부터 로딩하면 문제없겠구나...."
이런 엄청난 착각속에 빠져 Jeus 기동 시 ClassLoader의 우선 순위를 web-inf/lib에 선언되어 있는 library들부터 읽어오도록 jeus-web-dd.xml에 있는 webinf-first 속성을 true로 조정하고 재기동하였다.
결과는 잘못된 해결법답게 엄청난 ClassCastException을 발생시켰지만 구지구지 해결해보겠다고, library 하나하나 비교해가며 중복 된 library들을 제거하였다. 하지만 많은 양의 에러를 감당하지 못하고 결국 GG를 치고 다른 방법을 물색해야 했다.
다른 방법으로는 Tiles 버전을 2로 사용하고 있었는데
Tiles 버전이 낮아서 그런가? 3으로 하면 되겠지?
라는 생각으로 Tiles 버전을 3으로 바꾸기 위해 Spring 버전도 3.1에서 3.2로 바꾸고 하는 작업을 진행하였다. 우선 결론부터 이야기하자면 이렇게 해서는 해결될리가 없었다. Jeus6.0에서 Spring 3.2를 적용하는 것부터 막히는 것이다. Jeus에서 Spring 3.2를 지원하지 않는것인지 내가 실력이 미천하여 적용하지 못하는것인지 정확한 원인은 시간이 부족하여 파악하지 못하고 다른 방법을 찾아야 했다.
이렇게 이런저런 방법을 사용하던 중 Tmax에 전화를 걸어서 물어봐야하나.. 하던 찰나 어떤 글을 보게되었다.
http://blog.flurdy.com/2010/07/jetty-tomcat-jsp.html
Tomcat에서 Jeus로 변환 도중 발생하는 에러는 아니나 외국분 역시 Jetty로 개발하다가 Tomcat에 deploy 도중 java.lang.ClassNotFoundException: org.apache.el.ExpressionFactoryImpl 에러가 발생하였고 Maven에
1 2 3 4 5 | <dependency> <groupid>org.apache.tomcat</groupid> <artifactid>jasper-el</artifactid> <version>6.0.26</version> </dependency> | cs |
위 dependency를 추가하고 이러쿵저러쿵 쿵따리샤바라해서 해결이 되었음.. 하는 내용이다.
아! 나도 jasper-el library를 추가하면 되겠구나 해서 maven에 동일한 library를 추가하였지만 변함없이 org.apache.el.ExpressionFactoryImpl를 찾지못하길래 혹시 jeus에 system library폴더에 올리고 기동 시 바로 classloader에 등록되면 되지 않을까 해서 jar파일을 직접 등록하니 에러가 사라졌다.
아.. 에러코드에 떡하니 "org.apache.el.ExpressionFactoryImpl 못찾겠다 꾀꼬리" 하고 노래부르고 있었는데 jar파일 추가할 생각안하고 너무 삽질을 많이 한듯...
마지막으로 해결법에 대해 1줄로 요약하자면
Tomcat에 있는 jasper-el.jar 파일을 Jeus에 있는 system library폴더에 Ctrl+C, Ctrl+V 해라.
- window에서 Jeus system library폴더 경로 : C:\TmaxSoft\JEUS6.0\lib\system