본문 바로가기
오류를 개발새발

jar 를 실행하면 ClassNotFoundException 이 생긴다

by 휴일이 2023. 5. 18.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jwtTokenParser': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [today.also.hyuil.config.security.jwt.JwtTokenParser] from ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader@55f3ddb1]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1302) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1219) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.25.jar!/:5.3.25]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.25.jar!/:5.3.25]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.25.jar!/:5.3.25]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.9.jar!/:2.7.9]
	at today.also.hyuil.AlsoHyuilApplication.main(AlsoHyuilApplication.java:10) ~[classes!/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[hyuil-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[hyuil-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[hyuil-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[hyuil-0.0.1-SNAPSHOT.jar:na]
Caused by: java.lang.IllegalStateException: Failed to introspect Class [today.also.hyuil.config.security.jwt.JwtTokenParser] from ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader@55f3ddb1]
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:485) ~[spring-core-5.3.25.jar!/:5.3.25]
	at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321) ~[spring-core-5.3.25.jar!/:5.3.25]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267) ~[spring-beans-5.3.25.jar!/:5.3.25]
	... 26 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/json/JSONException
	at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
	at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) ~[na:na]
	at java.base/java.lang.Class.getDeclaredMethods(Class.java:2309) ~[na:na]
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:467) ~[spring-core-5.3.25.jar!/:5.3.25]
	... 28 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.configurationprocessor.json.JSONException
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476) ~[na:na]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[na:na]
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) ~[hyuil-0.0.1-SNAPSHOT.jar:na]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
	... 32 common frames omitted

 

 

클래스를 찾지 못하는 오류가 발생했다

jsonException 클래스를 찾지 못하는 거 같았다

 

찾아보니

나는

org.springframework.boot.configurationprocessor 에서 나오는

jsonObject 클래스를 사용 중이었는데

다른 의존성을 사용하는 것으로 바꿔야한다고 한다ㅠㅠ

 

 

그래서

해당 jsonObject 와 jsonException을 사용하는 코드를

 

    public String getTokenSecret(String token, String where, String what) throws JSONException {
        String[] jwt = splitToken(token);
        int x = 0;
        if (where.equals("header")) {
            x = 0;
        }
        if (where.equals("payload")) {
            x = 1;
        }
        if (where.equals("signature")) {
            x = 2;
        }

        //시그니쳐는 byte[] 배열로 받아와야함..
        if (x == 2) {
            byte[] signatureBytes = Base64.getDecoder().decode(jwt[2]);
            return new String(signatureBytes, StandardCharsets.UTF_8);
        }

        byte[] tokenBytes = Base64.getDecoder().decode(jwt[x]);

        String jsonString = new String(tokenBytes, StandardCharsets.UTF_8);
        JSONObject headerJson = new JSONObject(jsonString);

        return String.valueOf(headerJson.get(what));
    }

요걸

 

 

 

얘처럼

public String getTokenSecret(String token, String where, String what) {
String[] jwt = splitToken(token);
int x = 0;
if (where.equals("header")) {
x = 0;
}
if (where.equals("payload")) {
x = 1;
}
if (where.equals("signature")) {
x = 2;
}

//시그니쳐는 byte[] 배열로 받아와야함..
if (x == 2) {
byte[] signatureBytes = Base64.getDecoder().decode(jwt[2]);
return new String(signatureBytes, StandardCharsets.UTF_8);
}

byte[] tokenBytes = Base64.getDecoder().decode(jwt[x]);

String jsonString = new String(tokenBytes, StandardCharsets.UTF_8);
JsonObject headerJson = new JsonObject();
headerJson.addProperty(what, jsonString);

return String.valueOf(headerJson.get(what));
}

 

 

이렇게

com.google.gson.JsonObject 를 사용하도록 변경했다!!!

 

 

 

 

 

잘 빌드되는 것을 확인했다 ㅇ_ㅇ!

728x90