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.