Java 응용 프로그램을 실행하려고하는데이 오류가 발생합니다.
java.lang.ClassNotFoundException:
콜론 뒤에는 누락 된 클래스의 위치가 표시됩니다. 그러나 클래스가 다른 곳에 있기 때문에 그 위치가 존재하지 않는다는 것을 알고 있습니다. 해당 클래스의 경로를 어떻게 업데이트 할 수 있습니까? 클래스 경로와 관련이 있습니까?
Java 응용 프로그램을 실행하려고하는데이 오류가 발생합니다.
java.lang.ClassNotFoundException:
콜론 뒤에는 누락 된 클래스의 위치가 표시됩니다. 그러나 클래스가 다른 곳에 있기 때문에 그 위치가 존재하지 않는다는 것을 알고 있습니다. 해당 클래스의 경로를 어떻게 업데이트 할 수 있습니까? 클래스 경로와 관련이 있습니까?
답변:
클래스 경로가 손상되었습니다 ( Java 세계에서 매우 일반적인 문제).
응용 프로그램을 시작하는 방법에 따라 -cp
, MANIFEST.MF의 클래스 경로 항목 또는 디스크 레이아웃에 대한 인수를 수정해야 합니다.
클래스 경로는 클래스를로드 할 위치 목록입니다.
이러한 '위치'는 디렉토리 또는 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에는 클래스 경로를 지정하는 메뉴 옵션이 있습니다.
이것은 내가 지금까지 찾은 최고의 솔루션 입니다.
org.mypackage
클래스를 포함하는 라는 패키지가 있다고 가정 합니다.
이 패키지를 정의하는 파일은 물리적으로 디렉터리 D:\myprogram
(Windows) 또는 /home/user/myprogram
(Linux)에 저장됩니다.
Java를 호출 할 때 실행할 애플리케이션의 이름을 지정합니다 org.mypackage.HelloWorld
.. 그러나 패키지를 정의하는 파일과 디렉토리를 찾을 위치도 Java에 알려야합니다. 따라서 프로그램을 시작하려면 다음 명령을 사용해야합니다.
참고 :
java
현재 위치에 관계없이 위의 명령 을 실행 해야합니다. 그러나 이것은javac
. 컴파일을 위해.java
파일 이있는 디렉토리로 직접 이동하여javac ClassName.java
.
maven을 사용한다면 이것을 시도하십시오. 내 프로젝트에 maven을 사용 mvn clean install
하고 프로그램을 실행하려고하면 예외가 발생합니다. 그래서 프로젝트를 정리하고 다시 실행하면 저에게 효과적입니다.
이클립스 IDE를 사용합니다.
Junit 테스트를 실행할 때 클래스를 찾을 수 없음 예외의 경우 mvn clean test
한 번 실행 해보십시오 . 모든 테스트 클래스를 컴파일합니다.
사용하다 ';' 구분자로. 환경 변수가 올바르게 설정된 경우 설정이 표시되어야합니다. PATH 및 CLASSPATH가 올 바르면 창에서 해당 명령을 인식해야합니다. Java를 설치할 때 컴퓨터를 다시 시작할 필요가 없습니다.
jar 파일 의 전체 경로 를 CLASSPATH에 추가하십시오 . Linux에서는 export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
. 다른 방법은 (CLASSPATH를 편집하지 않고) 현재 프로젝트 폴더에서 jar 압축을 푸는 것입니다.
나를 위해 작동하지 않는 방법 :
1) -cp
jar 파일의 전체 경로로 옵션 사용 .
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 클래스에 대해보고됩니다.
클래스 경로가 올바르지 않은 경우 발생할 수 있습니다.
동일한 프로젝트 이름 아래에 직렬화 가능한 클래스와 역 직렬화 가능한 클래스를 배치 해 보겠습니다. 직렬화 가능 클래스를 실행하여 특정 폴더에 직렬화 가능 개체를 만듭니다. 이제 해저 화 된 데이터가 필요합니다. 그동안 프로젝트 이름을 변경하면 작동하지 않습니다. 직렬화 가능 클래스를 먼저 실행 한 다음 파일을 역 직렬화해야합니다.
기본 일반 질문-가장 간단한 일반 답변;)
정보가 주어지면 간단한 텍스트 편집기와 일부 명령 셸을 사용하여 "Hello World"와 같은 간단한 콘솔 앱을 코딩, 빌드 / 컴파일 및 실행하는 기본 접근 방식을 시도 할 수 있다고 가정합니다.
이 오류는 다음과 같은 시나리오에서 발생합니다.
..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
즉, 다음을 사용하십시오.
..\SomePath>java HelloWorld
PS 파일 확장자 .class를 추가하면 같은 실수가 발생합니다. 또한 운영 체제의 환경 변수의 PATH에 Java의 (JDK / JRE) bin 폴더가 있는지 확인하십시오. (이에 대한 자세한 내용은 다른 게시물을 참조하십시오) PPS 내 가정이 맞습니까?
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>
그것은 당신의 의존성 (예외 이유)을 항아리에 넣을 것입니다.
참고 : 이것은 최종 항아리에 부풀려진 모든 종속성을 포함합니다.