ClassNotFoundException을 어떻게 해결합니까?


106

Java 응용 프로그램을 실행하려고하는데이 오류가 발생합니다.

java.lang.ClassNotFoundException:

콜론 뒤에는 누락 된 클래스의 위치가 표시됩니다. 그러나 클래스가 다른 곳에 있기 때문에 그 위치가 존재하지 않는다는 것을 알고 있습니다. 해당 클래스의 경로를 어떻게 업데이트 할 수 있습니까? 클래스 경로와 관련이 있습니까?


1
누락 된 클래스가있는 항아리를 classptah에 추가해야합니다
Crom

클래스에 패키지가 있으면 클래스가 포함 된 폴더로 이동하십시오. 예를 들어 패키지가 test.abc 패키지이면 테스트 전에 폴더로 이동 한 다음 java -cp를 수행하십시오. test.abc.CLASSNAME (.class 제외). 패키지가 없으면 class가 포함 된 폴더로 이동하여 java -cp라고 말합니다. CLASSNAME
선택적 '

클래스가 런타임에 배포되지 않았거나 (예 : jar 누락) 클래스가 지정된 클래스 로더에 표시되지 않는 경우 이러한 문제를 해결하는 데 도움이되는이 도구를 확인하십시오. jhades.org
Angular University

1
나는 또한 때때로 이것에 부딪칩니다. 이 예외는 예외 메시지에 필요한 모든 컨텍스트를 명시하는 규칙을 분명히 위반합니다. 어디 에서 물건을 찾으려고했는지, 클래스 경로에 무엇이 있는지 언급해야 합니다. 더 나은 예외 메시지를 만드십시오. 문제 해결에 도움이되는 정보를 찾도록 만들지 마십시오.
masterxilo

답변:


32

클래스 경로가 손상되었습니다 ( Java 세계에서 매우 일반적인 문제).

응용 프로그램을 시작하는 방법에 따라 -cp, MANIFEST.MF의 클래스 경로 항목 또는 디스크 레이아웃에 대한 인수를 수정해야 합니다.


34
좀 더 구체적으로 말씀해 주시겠습니까? 무엇을해야합니까?
user2426316

24
질문에보다 구체적인 답변을 제공하기에 충분한 정보가 없습니다. 그것을 추가하는 것을 고려하십시오.
Thorbjørn Ravn Andersen

종속성 해결 / 버전 불일치는 기본적으로 모든 프로그래밍 환경에서 매우 일반적인 문제입니다. 우리는 모든 프로그램이 그러한 정의를 해결하는 것이라고 말할 수 있습니다. 질문은 항상 정의가 무엇이며 어디에 있고 어떤 버전을 의미합니까?
masterxilo

2
Java 세계 외에도 모든 소프트웨어가 올바른 버전의 종속성을 찾는 데 어려움을 겪고 있음을 강조하고 있습니다. 이 문제와 가능한 해결책의 예로 dll-hell, 패키지 관리자, 버전 관리자, 스프링 부트 BOM 및 도커 컨테이너를 언급 할 수 있습니다. 외래 코드의 비율이 클수록 문제가 커집니다.
masterxilo

@masterxilo 예,하지만 이것이 반드시 여기서 문제가되는 것은 아니며 잘못된 나무를 짖는 것일 수 있습니다. 말할 수있는 것은 클래스 경로가 손상되었다는 것입니다.
Thorbjørn Ravn Andersen

45

클래스 경로는 클래스를로드 할 위치 목록입니다.

이러한 '위치'는 디렉토리 또는 jar 파일 일 수 있습니다.

디렉토리의 경우 JVM은 클래스로드에 대해 예상되는 패턴을 따릅니다. 나는 디렉토리가있는 경우 / myproject라는 / 클래스 : C를 내 클래스 경로에, 나는 클래스로드하려고 com.mycompany.Foo를 그것이라는 디렉토리의 클래스 디렉토리 아래에 보이는 것, co.kr에서 그라는 디렉토리 아래 mycompany 하고, 마지막으로 해당 디렉토리에서 Foo.class 라는 파일을 찾습니다 .

두 번째 인스턴스에서는 jar 파일의 경우 해당 클래스에 대한 jar 파일을 검색합니다. jar 파일은 실제로 위와 같이 압축 된 디렉토리 모음입니다. jar 파일의 압축을 풀면 위의 패턴에 따라 많은 디렉토리와 클래스 파일이 생성됩니다.

따라서 JVM은 클래스 정의를로드하려고 할 때 클래스 정의를 찾기 위해 처음부터 끝까지 클래스 경로를 탐색합니다. 예를 들어, 클래스 경로에서 :

C : / myproject / classes; C : /myproject/lib/stuff.jar; C : /myproject/lib/otherstuff.jar

JVM은 먼저 디렉토리 클래스 를 찾은 다음 stuff.jar 에서 마지막으로 otherstuff.jar 에서 검색을 시도합니다 .

ClassNotFoundException이 발생하면 JVM이 전체 클래스 경로를 통과했지만 참조하려는 클래스를 찾지 못했음을 의미합니다. Java 세계에서 자주 사용되는 솔루션은 클래스 경로를 확인하는 것입니다.

java -cp 를 말한 다음 클래스 경로를 말하여 명령 줄에서 클래스 경로를 정의합니다 . Eclipse와 같은 IDE에는 클래스 경로를 지정하는 메뉴 옵션이 있습니다.


13

이것은 내가 지금까지 찾은 최고의 솔루션 입니다.

org.mypackage클래스를 포함하는 라는 패키지가 있다고 가정 합니다.

  • HelloWorld (메인 클래스)
  • SupportClass
  • UtilClass

이 패키지를 정의하는 파일은 물리적으로 디렉터리 D:\myprogram(Windows) 또는 /home/user/myprogram(Linux)에 저장됩니다.

파일 구조는 다음과 같습니다. 여기에 이미지 설명 입력

Java를 호출 할 때 실행할 애플리케이션의 이름을 지정합니다 org.mypackage.HelloWorld.. 그러나 패키지를 정의하는 파일과 디렉토리를 찾을 위치도 Java에 알려야합니다. 따라서 프로그램을 시작하려면 다음 명령을 사용해야합니다. 여기에 이미지 설명 입력

참고 :java 현재 위치에 관계없이 위의 명령 을 실행 해야합니다. 그러나 이것은 javac. 컴파일을 위해 .java파일 이있는 디렉토리로 직접 이동하여 javac ClassName.java.


6

클래스의 경로 또는 클래스를 포함하는 jar를 알고 있으면 실행하는 동안 클래스 경로에 추가하십시오. 여기에 언급 된대로 클래스 경로를 사용할 수 있습니다.

Windows에서

java -classpath .;yourjar.jar YourMainClass

UNIX / Linux에서

java -classpath .:yourjar.jar YourMainClass

4

maven을 사용한다면 이것을 시도하십시오. 내 프로젝트에 maven을 사용 mvn clean install하고 프로그램을 실행하려고하면 예외가 발생합니다. 그래서 프로젝트를 정리하고 다시 실행하면 저에게 효과적입니다.

이클립스 IDE를 사용합니다.

Junit 테스트를 실행할 때 클래스를 찾을 수 없음 예외의 경우 mvn clean test한 번 실행 해보십시오 . 모든 테스트 클래스를 컴파일합니다.


"mvn clean test"를 실행할 때 어떤 디렉토리에 있었습니까? POM과 동일한 디렉토리에 있습니까?
TacoB0t

1
예. pom 파일이있는 디렉토리에서 실행했습니다.
Arun

3

명령 줄을 통해 클래스 경로에 클래스 위치를 추가하려면 -cp또는 -classpath실행하는 동안 클래스 위치를 추가하기 만하면 됩니다. IE

java -cp "c:/location/of/file" YourProgram

또는 Eclipse와 같은 IDE를 실행하는 경우를 마우스 오른쪽 버튼으로 클릭하고 project -> build path -> configure build path 클래스가 포함 된 외부 JAR을 빌드 경로에 추가하면 제대로 작동합니다.


3

사용하다 ';' 구분자로. 환경 변수가 올바르게 설정된 경우 설정이 표시되어야합니다. PATH 및 CLASSPATH가 올 바르면 창에서 해당 명령을 인식해야합니다. Java를 설치할 때 컴퓨터를 다시 시작할 필요가 없습니다.


5
Windows (세미콜론), 유닉스 / 리눅스에서는 ':'(콜론)
Joeblade

3

jar 파일 의 전체 경로 를 CLASSPATH에 추가하십시오 . Linux에서는 export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". 다른 방법은 (CLASSPATH를 편집하지 않고) 현재 프로젝트 폴더에서 jar 압축을 푸는 것입니다.

나를 위해 작동하지 않는 방법 :

1) -cpjar 파일의 전체 경로로 옵션 사용 .

2) -cp현재 폴더에있을 때 jar 이름 만 사용하여 사용

3) 현재 프로젝트 폴더에 jar 복사

4) jar를 Java jar의 표준 위치 (/ usr / share / java)에 복사

이 솔루션은 OpenJDK 버전 1.7이 설치된 Linux에서 작동하는 mysql-connector-java.5-*. jar의 com.mysql.jdbc.Driver 클래스에 대해보고됩니다.


오직 나를 위해 일한 JAR 압축을 해제, 다른 솔루션 중 어느 것도하지 않았다
OverCoder

2

맨 위로 이동하여 import 문이있는 경우 제거하고 클래스를 다시 가져옵니다. 그러나 그것이 사실이 아니라면 깨끗한 다음 빌드하십시오. Netbeans 또는 Eclipse를 사용하고 있습니까?


2

나는 이것도 만났고 다른 모든 솔루션을 시도했습니다. HTML 폴더에 .class 파일이 없었고 .java 파일 만있었습니다. .class 파일을 추가하면 프로그램이 제대로 작동했습니다.


2
  1. 클래스 경로가 올바르지 않은 경우 발생할 수 있습니다.

  2. 동일한 프로젝트 이름 아래에 직렬화 가능한 클래스와 역 직렬화 가능한 클래스를 배치 해 보겠습니다. 직렬화 가능 클래스를 실행하여 특정 폴더에 직렬화 가능 개체를 만듭니다. 이제 해저 화 된 데이터가 필요합니다. 그동안 프로젝트 이름을 변경하면 작동하지 않습니다. 직렬화 가능 클래스를 먼저 실행 한 다음 파일을 역 직렬화해야합니다.


2

maven을 사용하는 경우 모든 프로젝트를 업데이트하고 스냅 샷을 강제로 수행하십시오. 그것도 청소하고 모든 클래스 경로를 다시 빌드합니다 .. 그것은 내 문제를 해결했습니다 ..


2

난 그냥했다

1. 캐시 무효화 및 재시작

2. 문제를 해결 한 내 프로젝트재 구축


1

Process클래스를 사용하여 C # 코드에서 .jar을 실행하려고했습니다 . Java 코드는 Eclipse에서 성공적으로 실행되었지만 C # Visual Studio에서는 실행되지 않았고 jar 파일을 직접 클릭해도 항상 ClassNotFoundException:예외 와 함께 중지되었습니다 . 내 해결책은 자바 프로그램을 "JAR 파일"대신 "실행 가능한 JAR 파일"로 내보내는 것입니다. 누군가를 도울 수 있기를 바랍니다.


1

이는 이전 버전의 Java SDK가없고 새 버전이있는 Java 업데이트 후 Windows에서 발생할 수 있습니다. IDE가 설치된 Java SDK 버전을 사용하고 있는지 확인합니다 (IntelliJ : CTRL + SHIFT + ALT + S).


1

여러 (타사) ** 라이브러리를 추가하고 ** 애플리케이션 클래스를 확장 한 경우

그러면 발생할 수 있습니다.

이를 multiDexEnabled true위해 확장 Application클래스를 MultiDexApplication.

해결 될 것입니다.


1

기본 일반 질문-가장 간단한 일반 답변;)

정보가 주어지면 간단한 텍스트 편집기와 일부 명령 셸을 사용하여 "Hello World"와 같은 간단한 콘솔 앱을 코딩, 빌드 / 컴파일 및 실행하는 기본 접근 방식을 시도 할 수 있다고 가정합니다.

이 오류는 다음과 같은 시나리오에서 발생합니다.

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

즉, 다음을 사용하십시오.

..\SomePath>java HelloWorld

PS 파일 확장자 .class를 추가하면 같은 실수가 발생합니다. 또한 운영 체제의 환경 변수의 PATH에 Java의 (JDK / JRE) bin 폴더가 있는지 확인하십시오. (이에 대한 자세한 내용은 다른 게시물을 참조하십시오) PPS 내 가정이 맞습니까?


1

maven을 사용하는 경우 다음 플러그인이 있는지 확인하십시오 pom.xml.

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

그것은 당신의 의존성 (예외 이유)을 항아리에 넣을 것입니다.

참고 : 이것은 최종 항아리에 부풀려진 모든 종속성을 포함합니다.


@Archit이 추가되었습니다.
techkuz

0

제 경우에는 클래스를 찾을 수 없음 예외로 던져진 클래스에 SSL 인증서와 관련된 속성이 있습니다. 일식을 닫고 "관리자 권한으로 실행"으로 연 다음 문제가 해결되었습니다. 이클립스에 문제 관련 권한이 있으므로 이러한 종류의 예외가 발생합니다.


-7

모든 코드를 try 블록에 넣은 다음 catch 블록에서 예외를 catch합니다.

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
이것은 예외를 해결하지 않습니다. 이것은 예외를 숨 깁니다. 게다가, "e1.getmessage ()"는 a) getMessage ()의 잘못된 대문자 사용이고 b) 메시지와 함께 문자열을 반환하고 메시지를 인쇄하거나 로깅하지 않기 때문에 그다지 많이 수행하지 않을 것입니다!
IBBoard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.