sts4 프로젝트 복사 시 발생하는 오류 해결 방법

2023. 11. 17. 22:32웹프로그래밍

 

문제 상황

프로젝트를 복사해 일부분만 수정해야 해서 기존에 만들었던 routine_project를 복사해서 사용했다.

하지만 프로젝트를 실행하자 오류가 계속 터졌다.

해결 방법

1.an attempt was made to call a method that does not exist. the attempt was made from the following location

--> 이 오류는 스프링 부트에서 사용하는 톰캣 서버의 버전이 호환되지 않아 발생합니다. 오류 메시지에서 볼 수 있듯이, org.apache.catalina.Context 클래스는 톰캣 10.0.27 (catalina.jar)과 톰캣 9.0.73 (tomcat-embed-core-9.0.73.jar) 두 곳에서 로드되었습니다. 

chat gpt에 따르면 톰캣 서버의 버전이 호환되지 않아 발생하는 문제였다.

시도 1. pom.xml 톰캣 버전 명시 

여러 톰캣 버전을 사용하고 있어서 톰캣 버전을 pom.xml에 명시해줘야 한다는 것을 알게 되었다.

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
</dependency>

                                                                                    |

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <version>9.0.41</version>
  <scope>provided</scope>
</dependency>

artifactId와 scope 사이에 사용하고 싶은 톰캣의 버전을 명시해주었다.

하지만 내가 사용하고 있는 spring 버전인 2.7.10에서는 spring 버전과 맞는 톰캣 버전을 자동으로 지정하기 때문에, 오히려 명시를 하면 오류가 났다. 

 

시도 2. 자바 버전 변경

나의 톰캣 서버 버전과 자바 버전이 호환되지 않아 생기는 문제일 가능성도 있어서, root 디렉토리에서 cmd를 열어 java -version을 확인해주었다.

java -version이 11로 되어있어서 17로 변경해야겠다 느꼈다.

프로젝트에서 자바 버전을 변경하는 방법은

1. pom.xml에서 java의 version에 17을 넣어주어야 한다.

2. 시스템 환경 변수의 JAVA_HOME 말고 Path에 java 17의 bin 디렉토리를 넣어준다.

3. 프로젝트 우클릭 -> properties -> Project Facets -> java 옆 to select에서 17로 변경 -> Apply

4. Java Build Path -> Libraries -> Execution environment JavaSE-17로 변경 -> Finish -> Apply 

5. Apply and Close

 

여전히 되지 않았다. 자바 버전과 호환이 안 되는 것보다 톰캣 버전 두 개가 충돌하고 있어서 발생한 문제라서 자바의 버전과는 관계가 없었다.

 

 

시도 3.

톰캣 버전이 9와 10이 있었기 때문에 문제가 되는 10을 삭제하기로 결심했다. 

그래서 프로젝트 우클릭 -> Build Path -> Libraries -> Server Runtime -> 톰캣 버전 10 선택 -> remove -> Apply를 해주었다.

그 다음 프로젝트 우클릭 -> ClassPath -> 우측 Add Library -> 새로 설정할 9.0 버전 선택 -> Finish

 

시도 3 끝에 톰캣 호환 문제는 사라졌지만 다른 문제가 나타나기 시작했다.

더보기

The error message you're seeing indicates that there is a version mismatch between the classes org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory and org.apache.catalina.Context in your application's classpath. Specifically, it looks like the TomcatServletWebServerFactory class is trying to call a method on the Context class that doesn't exist in the version of Context that is available in your classpath.

 

이 오류는 자바와 톰캣 버전이 호환되지 않는다는 의미였다.

 

그래서 아예 m2 폴더를 깨끗하게 삭제하고 다시 설치해야겠다 결심했다.

 

m2 폴더는 대부분 사용자 폴더 밑에 존재하며, .m2라고 명시되어 있다.

.m2 내부의 repository를 삭제한 후, 설치를 원하는 프로젝트의 root 디렉토리에서 mvn install 명령을 실행시켜주면 된다.

 

나는 Coop 프로젝트여서, workspace의 Coop 폴더로 들어가 cmd를 열고 mvn install 명령을 내렸다.

 

이제는 오류가 발생하지 않았지만, 다른 오류가 발생하기 시작했다.

 

더보기

오류: 기본 클래스 com.hyewon.routine_project.DemoApplication을(를) 찾거나 로드할 수 없습니다. 원인: java.lang.ClassNotFoundException: com.hyewon.routine_project.DemoApplication

기본 클래스 DemoApplication을 로드할 수 없다는 것이 문제였다.

이때 아차 싶었다. 내가 만든 프로젝트는 Coop인데, 패키지가 여전히 복사했던 프로젝트 이름인 routine_project로 설정되어 있었다.

 

application.yml 파일에도 여전히 프로젝트 이름은 Routine으로, 프로젝트 패키지는 routine_project로 설정되어 있었다.

 

그래서 복사했던 모든 폴더의 패키지를 바꾸기 시작했다.

 

1. application.yml 파일의 mybatis와 custom과 file 디렉토리를 모두 Coop로 바꿔주었다.

2. 가장 위에 있는 패키지인 com.hyewon.routine_project를 com.hyewon.Coop로 바꿔주었다.

 

그랬더니 모든 오류가 사라지고, 서버 접속이 됐다!

 

이외에도

1. 프로젝트 우클릭 -> Maven -> Update Project

2. 프로젝트 우클릭 -> Run As -> Maven Clean

3. local 밑의 프로젝트 서버 우클릭 -> (Re)start

4. 프로젝트 우클릭 -> Refresh

등이 있으니 시도해보시길 바란다!

 

 

회고

너무 간단한 부분을 놓치고 있었다는 생각에 헛웃음이 나왔다.

그래도 다양한 문제를 접해보고 해결해보면서, Spring boot에 대해서 더 배울 수 있는 계기가 되었다.

이유 없는 오류는 없다는 걸 다시금 깨닫고 앞으로 더 공부하며 실수와 오류를 줄여나가야겠다