티스토리 뷰

Tomcat 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

최근에 올라온 글
Total
Today
Yesterday
링크