예를 들어, Intellij 에서 직접 External Libraries 또는 어떤 객체의 사용 위치를 참조하여 파일을 살펴볼 때 아래와 비슷하게 메세지가 나타나는 경우가 있다.

Decompiled .class file, bytecode version: 57.0 (Java 13)

보통 개발을 하면서 문제가 생겼을 때 디버깅을 찍어보면서 Spring 과 같은 다른 라이브러리의 내부 코드를 들여다보던지 아니면 평소대로 라이브러리에서 지원하는 메서드를 사용하려고 할 때 주석이라던지를 참조를 하게 되는데 자기가 직접 스스로 라이브러리를 만들면서 Maven 또는 직접 운영하는 Nexus 에 라이브러리를 등록하여 사용을 할 때 만약 아무런 빌드 옵션을 주지 않고 등록을 하게 되면 위와 같이 바이트 코드만 볼 수 있게 된다.

 

gradle 기준으로 위 문제는 아래와 같이 배포를 할 때 artifact 로 sources Jar 를 같이 첨부를 해야 해결할 수 있다.

task sourceJar(type: Jar) {
    from sourceSets.main.java.srcDirs
    classifier('sources')
}

if (project.hasProperty('username') && project.hasProperty('password')) {
    publishing {
        publications {
            maven(MavenPublication) {
                from components.java
                artifact sourceJar
            }
        }
        repositories {
            maven {
                url repoUrl
                allowInsecureProtocol(false)
                credentials {
                    username project.property('username')
                    password project.property('password')
                }
            }
        }
    }
}

bootJar.enabled(false)
jar {
    enabled(true)
    // Spring 라이브러리를 참조할 경우 plain 이 붙기 때문에 삭제를 해줘야 함
    // https://stackoverflow.com/questions/67663728/spring-boot-2-5-0-generates-plain-jar-file-can-i-remove-it/67752182#67752182
    classifier('')
}

 

만약, 그 후에 특정 프로젝트에서 라이브러리를 사용할 때 아래와 같이 바이트 코드와 실제 코드가 서로 맞지 않다고 나타나면

Library source does not match the bytecode for class

 

Intellij > Files > Invalidate Caches... > Restart

를 통해서 캐시값을 지우고 다시 시도해보자