2016-09-15 2 views
2

전자 메일 파서를 개발하려고합니다. 파일에 포함 된 전자 메일을 가져 와서 프로그래밍 방식으로 다양한 구성 요소를 처리 할 수 ​​있습니다. 보낸 사람과받는 사람 제목, 본문 및 첨부 파일이 포함됩니다. 첨부 파일을 개별 파일로 추출하려고하지만, 처음에는 당황 스럽습니다.패키지가 CLASSPATH에 있어도 javax.mail.MimeMessage를 사용할 수 없음

필자는 모든 기능을 갖춘 개발 환경에서 이미 작동하는 Java 프로그램으로 시작하여 추가 작업을 시작했습니다. 첫 번째 추가 중 하나는 (나중에, 라인 세트)이 줄을이었다

import javax.mail.*; 
import javax.mail.internet; 
import javax.mail.internet.MimeUtility; 

나중에 적절한 장소에, 우리는이 겸손 시작이 : 나는 것을 발견 충격을 받았다

MimeMessage m = null; 

을 이 두 가지 변경 사항만으로는 컴파일이 실패했고 패키지 javax.mail 패키지가 표준 JDK에 포함되어 있지 않은 다른 스택 오버 플로우 페이지의 I learned here이 실패했습니다. 의아해, 나는 이것을보고 발견했다 :

# rpm -qa | grep -i java 
android-json-org-java-4.3-0.2.r3.1.fc21.noarch 
snappy-java-1.0.5-2.fc21.noarch 
tzdata-java-2015b-1.fc21.noarch 
python-javapackages-4.1.0-7.fc21.noarch 
postgresql94-jdbc-javadoc-9.3.1101-1.f21.noarch 
protobuf-java-2.5.0-11.fc21.x86_64 
java-1.8.0-openjdk-1.8.0.40-25.b25.fc21.x86_64 
java-1.8.0-openjdk-headless-1.8.0.40-25.b25.fc21.x86_64 
javassist-3.18.1-2.fc21.noarch 
apache-commons-javaflow-1.0-0.8.20120509SNAPSHOT.fc21.noarch 
javapackages-tools-4.1.0-7.fc21.noarch 
java-1.8.0-openjdk-devel-1.8.0.40-25.b25.fc21.x86_64 
antlr3-java-3.5.2-2.fc21.noarch 
javamail-1.5.1-3.fc21.noarch 
xz-java-1.5-3.fc21.noarch 
abrt-java-connector-1.1.0-2.fc21.x86_64 

예, 실제로 JavaMail이 설치되어 있음을 유의하십시오. - 버전 1.5.1-3. 그러나, 그냥 벨트와 서스펜더 일종의 사람이되고, 나는 the JavaMail project을 발견하고 최신 생산 버전을 다운로드하고 CLASSPATH에 넣어.

내 놀라운 점은 이것이 문제를 해결하지 못했다는 것입니다. 신중한 유형이므로 내가가는대로 방법을 증명할 수있는 간단한 방법으로 라이브러리 디렉토리에서 javax.mail.jar 파일을 제거한 다음 내 프로그램에서 두 줄을 제거하고 다시 컴파일하여 작동했습니다. 그런 다음 가져 오기 줄에 다시 추가했는데 실패했습니다. 그런 다음 jar 파일을 라이브러리 디렉토리로 다시 이동 시키면 컴파일이 성공하여 javax.mail 패키지가로드되고 있음을 확인합니다.

그러나 라이브러리에 대한 첫 번째 참조 인 MimeMessage (위의 줄 참조)를 추가하면 컴파일이 실패합니다.

그럼, 물론 check the documentation!으로갔습니다. 실제로 MimeMessage는 사용 가능한 클래스입니다.

내가 뭘 잘못하고 있니?! 제 말은, 저는 1.0 버전부터 문자 그대로 Java를 사용하고 있습니다. - 나는 너무 많은 바보 같은 실수를 한 것으로 알려져 있지 않지만 반드시 있어야한다고 생각합니다!

1) 당사은 JavaMail 패키지의 설치 버전

를 사용하지 않을 :

두 개방형 질문은 내 마음에 와서? 분명히 그것을 추가해야했습니다. 그리고 CLASSPATH (또는 그 밖의 다른 곳)에서 Java의 나머지 부분을 모두 얻으려면 특별한 작업을 수행 할 필요가 없다는 점에 유의하십시오. 과;

2) JavaMail 패키지가 생겼으니 왜 MimeMessage 클래스를 발견하지 못합니까?

모든 도움을 주셨습니다. 만약 내가 우스꽝 스럽다고 생각한다면, 제 실수를 부드럽게 지적하십시오!

추가 정보 : 두 개의 추가 가져 오기 줄이 추가되었으므로 위에 나열된 세 가지가 추가되었습니다. CLASSPATH에 지정된 경로에 .jar 파일이 있지만 명시 적으로 인용되지 않은 경우, 가져 오기 당 하나의 오류가 발생하지만 명시 적 항목으로 .jar 파일을 명시 적으로 인용하면 오류가 하나만 발생합니다!즉, 하나의 오류가에 : 항아리 실제로 단지 우편 것을 알고, 당연히

import javax.mail.internet; 

, 나는 압축이 풀린 보았다. 물론 "internet"이라는 디렉토리가 38 개의 클래스 파일로 채워져 있습니다.

어딘가에도 시스템이나 CLASSPATH에 다른 형식의 javax.mail 항목이 있다는 것을 알았습니다. 그래서 보았습니다. 이것은 Fedora Core이므로/usr/lib에 있으며 이름에 "mail"이라는 문자열을 포함한 다른 파일을 찾지 못했습니다. 그래서 그 파일도 아닙니다.

NOTES.txt 파일에서 보안 위험으로 여겨 졌기 때문에 항아리 포장을 풀지 않는 것에 대한 메모가 있지만 위험 부담이 없다고 생각했습니다. 어쩌면 작동 할 수도 있지만 그 중 하나를 작동시키지 못했습니다 ...

나는 실제로 CLASSPATH 변수를 변경하는 대신에 -cp를 사용하려고 시도했지만 문제가되지는 않습니다. 분명히 동일한 결과를 얻을 수 있으므로 다양한 대안을 시도하는 것이 빠르기 때문에 테스트 용으로 -cp를 사용했습니다.

+0

JAR을 클래스 경로에 어떻게 추가 했습니까? –

+0

@TimBiegeleisen 방금 다른 이유로 CLASSPATH에있는 라이브러리 디렉토리에이 파일을 저장했습니다. –

+0

Java 애플리케이션을 실행하는 대부분의 방법은 클래스 경로를 결정하기 위해 실제로'CLASSPATH' 환경 변수를 사용하지 않습니다. –

답변

2

MimeMessage는 가져 오지 않은 javax.mail.internet 패키지에 있습니다.

EDITED BY 질문 ASKER는 :

import javax.mail.internet; 

을 그리고 그것은 작동하지 않았다 :

사실, 난 무엇보다도 가져 오려고했다. 내가 놓친 것은 javax.mail.internet에서 가져올 것이 아무것도 없다는 것입니다. 변경 :

import javax.mail.internet.*; 

잘 작동했습니다.

빌이 정확하지 않은 반면,이 대답과 그의 코멘트는 내가 눈이 멀었다는 것을 알게되었습니다. 나는 바보가됩니다!

+0

나는 잠시 동안이 문제를 제쳐두고 설정했다. 대부분의 일을 끝내기 위해 ripmime을 사용했는데, 이제는 실제로 이것을 고칠 필요가있다. 여러분이 잘못 본 것으로 밝혀졌습니다. 실제로 javax.mail.internet을 가져오고, 더욱 구체적으로는 javax.mail.internet.MimeUtility을 가져 왔습니다. Q 업데이트 할게요. –

+0

위의 경우 "import javax.mail. *;"만 있으면 "import javax.mail.internet. *"을 추가 했습니까? MimeUtility 만 가져 오더라도 전체 패키지에 액세스 할 수는 없습니다. –

+0

나는 그것을 얻는다, Bill. 그러나 어떤 종류의 수업이라도 중요한 진보가 될 것이다. 현재 수입 명세서를 지나칠 수 없습니다! 내가 전부를 가져 와서 성공할 것이라고 말하지 않는다면?! 이상한. 그러나이 시점에서 나는 무엇이든 시도 할 것입니다. –

관련 문제