Server/WAS
[Jeus] java.lang.LinkageError: loader constraint violation 오류 조치
호형
2022. 2. 28. 11:01
Jeus 기동시에 다음과 같은 오류가 발생하였다.
<< Exception >>
jeus.servlet.deployment.StartingException: A web module deployment error occurred.
at jeus.servlet.engine.Context.distributeInternal(Context.java:1589)
at jeus.servlet.engine.Context.postDistribute2(Context.java:1402)
at jeus.servlet.deployment.WebModuleDeployer.postDistribute2(WebModuleDeployer.java:216)
at jeus.deploy.deployer.AbstractDeployer.distribute2(AbstractDeployer.java:301)
at jeus.deploy.deployer.AbstractDeployer.distribute(AbstractDeployer.java:244)
at jeus.deploy.deployer.DeploymentAdministrator.distribute(DeploymentAdministrator.java:244)
at jeus.server.Server.innerSingleDistribute(Server.java:2907)
at jeus.server.Server.access$1700(Server.java:161)
at jeus.server.Server$InnerDistributeAppTask.run(Server.java:2758)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at jeus.util.pool.ManagedThreadPoolImpl$1.run(ManagedThreadPoolImpl.java:81)
at jeus.util.pool.ManagedThreadPoolImpl$WorkWrapper.run(ManagedThreadPoolImpl.java:279)
at jeus.util.pool.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:1301)
at jeus.util.pool.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:1345)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method m
javax.servlet.ServletContext.getServletRegistration(Ljava/lang/String0Ljavax/servlet/Servle tRegistration;"
the class loader (instance of jeus/servlet/loader/ContextLoader) of the current class,
jeus/webservices/jaxrs/servlet/init/JaxiisServletContainerInitializer, and the class loader (instance of jeus/server/classloader/RootClassLoader)
for the method's defining class, javax/servlet/ServletContext, have different Class objects for the type javax/servlet/ServletRegistration used in the signature
at jeus.webservices.jaxrs.servlet.init.JaxAsServletContainerInitializer.addServletWithDefaultConfiguration(JaxAsServletContainerInitializer.java:251)
at jeus.webservices.jaxrs.servlet.init.JaxAsServletContainerInitializer.onStartupImpl(JaxAsServletContainerInitializer.java:193)
at jeus.webservices.jaxrs.servlet.init.JaxAsServletContainerInitializer.onStartup(JaxAsServletContainerInitializer.java:154)
at jeus.webservices.jaxrs.servlet.JAMSProxyServletContainerInitializer.doCnStartup(JAMSProxyServletContainerInitializer.java:74)
at jeus.webservices.jaxrs.servlet.JAMSProxyServletContainerInitializer.onStartup(JAMSProxyServletContainerInitializer.java:63)
at jeus.servlet.listener.ListenerManager.fireServletContainerInitializers(ListenerManager.java:645)
at jeus.servlet.listener.ListenerManager.start(ListenerManager.java:249) at jeus.servlet.engine.Context.distributeInternal(Context.java:1563)
...
여기서 핵심은 23번째줄에 있는 have different Class objects for the type javax/servlet/ServletRegistration used in the signature 인듯 싶다. "javax/servlet/servletRegistration 유형에 대해 다른 클래스 개체가 있습니다."
즉 기동을 하는데 있어서 중복되는 무언가가 있어서 오류가 난다는 메세지이다. 그래서 Jeus system library 와 application에서 사용하는 library를 비교를 해봤는데 중복되는 무언가를 발견하지는 못했다.
그래서 Jeus가 기동을 하는 시점에 class loader의 우선순위를 생각해보기로 했다. 그러던중 Jeus에는 jeus-dd-web.xml에 class loader와 관련있는 설정이 있다는것을 알게 되었다. 바로 webinf-first라는 설정이다.
jeus-dd-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
<context-path>/</context-path>
<webinf-first>
<enabled>false</enabled>
</webinf-first>
</jeus-web-dd>
문제가 발생했을때는 webinf-first 설정이 true로 되어 있었다. 즉 기동의 우선 순위를 WEB-INF를 우선시하고 그다음에 Jeus 관련 파일을 loading한다는건데 이게 문제였다. 설정을 false로 변경(or default=false라 기재하지 않아도 됨)해주니 그다음부터는 기동이 잘 되었다.
끝!