2011-01-13 1 views
1

Eclipse에서 응용 프로그램을 개발 중이며 Eclipse 내에서 정상적으로 실행됩니다. 내가 가지고있는 문제는 jar 파일로 내보내고 명령 줄에서 실행하면 javax.mail.internet에 NoClassDefFound 오류가 발생한다는 것입니다.java.lang.NoClassDefFoundError in command line

내 프로젝트에서 경로 및 클래스 경로를 빌드 할 때 javax.mail.internet을 사용하기 위해 필요한 activation.jar 및 mail.jar 라이브러리가 포함되어 있으며 Eclipse 내에서 제대로 작동한다고했지만 항아리에 내 보냅니다. 내 빌드 경로에 이러한 파일이 있고 내 클래스 경로가 작동하지 않는 이유는 무엇입니까? Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mai l/internet/InternetAddress at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour ce) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.mail.internet.InternetAddress at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 27 more

+0

은 '... javax/mai l/internet ...'의 공간으로 복사/붙여 넣기 또는 출력 인터리브 문제가 있습니까? –

+0

예 복사/붙여 넣기 문제. – Graham

답변

2

와우 나는 완전한 바보 같은 느낌. Eclipse에서 "JAR File"을 선택하는 대신 jar 파일로 내보낼 때 "Runnable JAR File"을 선택한 다음 필요한 라이브러리를 패키지화하여 작은 크기와 wa-la로 유지하도록하십시오. 모든 것이 잘 작동합니다. . 항아리가 생성 될 때

또 다른 옵션은 매니페스트 파일에 다음 줄을 추가하는 것입니다 Class-Path: lib/mail.jar

을 그리고 단지 동일한 폴더 내에에 mail.jar와 lib 폴더가 그 보낸 항아리 것 들어라. 붐.

전 옵션이 제 의견으로는 최고입니다.

0

하나의 가능성은 패키지를 javax.mail 클래스 (일명 전이 의존성)에 따라 달라집니다 빠진 것을 것 : 여기

오류 스택이다. 하지만 먼저 classpath를 다시 확인합니다. java 명령 줄 실행 파일은 누락 된 디렉토리 (또는 존재하지 않는 참조 된 jar)를 전혀 표시하지 않습니다. 필자는 세미콜론과 콜론을 경로 구분 기호로 섞어서 클래스를 찾을 수없는 경우가 있습니다.

JDK 1.6가 마지막으로, 와일드 카드를 정의 할 수있는 능력이었다 있었다 하나 개의 좋은 것은 당신이 할 수있는 :

java -cp lib/\* 

(유닉스 셸을 확장하지 않도록 인용 별표에 사용되는 백 슬래시)

을하는 것 'lib /'디렉토리의 모든 jar를 포함합니다. 그 디렉토리에 모든 개별 jar를 수동으로 추가 할 필요가 없습니다.

+0

내 클래스 패스에 확실히 있습니다. 바로 여기에 항목이 있습니다 : \t' \t ' – Graham

+0

아니요 그렇지 않으면이 예외가 발생하지 않습니다. 이 라이브러리 항목은 eclipse 컴파일 및 실행 환경 용이며 독립형 환경 용 항목이 아닙니다. 그게 왜 일식에서 작동하는지, 당신은 libs가있는 폴더에 클래스 경로를 설정해야합니다. – eglobetrotter

+0

자바 웹 사이트에서 개별적으로 다운로드하여 lib 폴더에 넣은 다음 프로젝트의 빌드 경로에 추가하여 추가했습니다. 내 보낸 jar의 매니페스트 파일에 전혀 표시되지 않습니다. 그들은 항아리 안에있는 lib 폴더에 나타나고 있습니다. 내가 여기서 무엇을 놓치고 있니? – Graham

1

이것은 거의 클래스 경로 문제입니다. 내 보낸 jar를 열거 나 (winzip을 사용하거나 .zip으로 이름을 바꾸고 창을 사용) 시도해보십시오. "jar"폴더 구조를 검사하여 "javax/mail/internet /"이 있고 InternetAddress.class 파일이 포함되어 있는지 확인하십시오. 또는 JAR에있는 MANIFEST.MF를 열어 classpath 항목이 들어 있고 매니페스트에 지정된 jar가 매니페스트에 지정된 위치에 존재하는지 확인합니다.

편집 : 는 JVM의 시스템 등록 정보에서 인쇄하여 런타임 클래스 경로를 검사합니다.

System.out.println(System.getProperty("java.class.path")); 

내가 당신이 누락을 발견 한 것 같아, 수동 검사의 추가 작업을 통해 이동하지만 가끔 계시인지 확인해서 죄송합니다.

일반적으로 jar 파일은 jar 파일 내에 포함되어 있지 않습니다. 실행 파일을 내보내는 일반적인 두 가지 방법은 다음과 같습니다.

  1. 클래스 파일을 Jar하고 JVM이 사용자 자신과 관련된 다른 라이브러리를 찾을 수있는 클래스 경로를 지정하는 목록을 포함시킵니다.
  2. 다른 항아리의 내용과 함께 클래스 파일을 단일 항아리에 저장하십시오. 이는 eclipse의 "내보내기 ...> Runnable JAR File"마법사를 사용하여 원하는대로 수행 할 수 있습니다. "Runnable JAR File"을 사용하고 올바른 실행 구성을 선택하십시오. 당신은이 SO 관련 질문을 찾을 수 있습니다

: Classpath including JAR within a JAR

+0

@Graham, 제 편집을 참조하십시오. 나는 당신이 당신이 클래스 패스를 어떻게 지정하고 있다고 생각하는지 이해하지 못한다. 귀하의 상황을 올바르게 이해하면 일식에서 수출하는 방법을 변경해야합니다. 마지막에 제공되는 링크는 항아리 안에 항아리가있는 것이 왜 효과가 없는지를 설명합니다. –

0

는 클래스 패스에 mail.jar을 추가하고 시작 디렉토리 lib 디렉토리의 부모 (후자는 가장 가능성 문제를 보인다) 있는지 확인합니다. 당신이 좋아/떨어지게 승 주요 방법을 시작할 수 있습니다

System.getProperties().store(System.out, "boot props");