본문 바로가기
WEB, WAS

embedded jetty 9.2 -> 9.4 migration 작업

by 애플 로그 2023. 4. 3.
반응형

jetty 관련 라이브러리들을 9.2.27.v20190403  -> 9.4.51.v20230217 으로 교체하는 작업 진행 중에 있다.

이와 같은 문서는 거의 stackoverflow와 같은 외국 사이트 외에 한국 문서는 거의 존재하지 않는것 같다.

문제 발생내용과 해결 위주로 정리한다.

 

이슈 1) maven repo에서 jetty-jsp 9.4 버전은 제공하지 않는다.

<org.eclipse.jetty.version>9.4.51.v20230217</org.eclipse.jetty.version>

< jetty-jsp 외 버전 업데이트시 문제 되지 않았음.>

<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-server</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-http</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-continuation</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-servlets</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-webapp</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-annotations</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>

<문제 발생>

<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-jsp</artifactId>
   <version>9.4.51.v20230217</version>
</dependency>

* jetty-jsp:9.4.51.v20230217 는 maven repo에 존재 하지 않는다.

 

 

 

< 해결 >

jetty-jsp 는 9.3이후 apache-jsp로 관리 되고 있다.

참고 : https://stackoverflow.com/questions/32243063/jsp-support-in-jetty-9-3

 

<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>apache-jsp</artifactId>
   <version>${jetty.version}</version>
</dependency>

 

 

이슈 2) org.apache.tomcat.InstanceManager set in ServletContext 에러 발생 

javax.servlet.ServletException: org.apache.jasper.JasperException: java.lang.IllegalStateException: 
No org.apache.tomcat.InstanceManager set in ServletContext
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:162)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
	at org.eclipse.jetty.server.HttpChannel$$Lambda$62/14700611.dispatch(Unknown Source)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:137)
	at org.eclipse.jetty.io.ManagedSelector$$Lambda$40/29226304.run(Unknown Source)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.lang.Thread.run(Thread.java:745)

 

<해결>

 - 제거

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

 

- 변경

<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>apache-jstl</artifactId>
   <version>${org.eclipse.jetty.version}</version>
</dependency>

 

이슈 3) No org.apache.tomcat.InstanceManager set in ServletContext 에러발생 

javax.servlet.ServletException: org.apache.jasper.JasperException: java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:162)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel$$Lambda$150/10711994.dispatch(Unknown Source)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.jasper.JasperException: java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext

 

 

<해결> 아래 코드 추가

 

webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$");
webAppContext.setAttribute("org.eclipse.jetty.containerInitializers", jspInitializers());
   // webAppContext.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager());
webAppContext.addBean(new ServletContainerInitializersStarter(webAppContext), true);
webAppContext.setClassLoader(new URLClassLoader(new URL[0], Main.class.getClassLoader()));
private static List<ContainerInitializer> jspInitializers() {
    JettyJasperInitializer sci = new JettyJasperInitializer();
    ContainerInitializer initializer = new ContainerInitializer(sci, null);
    List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>();
    initializers.add(initializer);
    return initializers;
}

 

 

참고자료: 

https://github.com/jetty-project/embedded-jetty-jsp/ 

https://e42.uk/fancyhtml/quickreference/jettyjsp9error.html

댓글