javax.mail.MimeMessage 即使包在 CLASSPATH 中也不可用

javax.mail.MimeMessage not available even though package is in CLASSPATH

我正在尝试开发一个电子邮件解析器 - 获取文件中的电子邮件并能够以编程方式处理各种组件 - 了解发件人和收件人是谁、主题行、正文和任何内容附件。我打算将附件提取为单个文件,但一开始就被难住了。

我从一个在全功能开发环境中运行的 java 程序开始,并开始向其中添加内容。最先添加的内容之一是这一行(后来是一组行):

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

后来,在一个合适的地方,我们有了这个卑微的开头:

MimeMessage m = null;

我震惊地发现只有这两个更改导致编译失败,并且 I learned here(在另一个 Whosebug 页面上)包 javax.mail 包未包含在标准 JDK。百思不得其解,看了下发现:

# 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 是可用的 class。

我做错了什么?!我的意思是,天哪,我从 1.0 版开始就一直在使用 Java - 我并不以犯太多愚蠢的错误而闻名,但我想我一定是!

我想到了两个悬而未决的问题:

1) 为什么没有使用 JavaMail 包的安装版本?显然我必须添加它。请注意,我不必对 CLASSPATH(或其他任何地方)做任何特别的事情来获得 Java 的所有其余部分!并且;

2) 既然我已经有了一个 JavaMail 包,为什么它没有发现 MimeMessage class?

感谢任何/所有帮助 - 如果您发现我非常愚蠢,请温和地指出我的错误!

附加信息: 我添加了两个导入行,所以现在有上面列出的三个。奇怪的是,当我在 CLASSPATH 指定的路径中有 .jar 文件,但没有明确引用时,每次导入都会出现一个错误,但是当我明确引用 .jar 文件作为一个显式项时,我只会收到一个错误!一个错误是:

import javax.mail.internet;

自然而然地,知道罐子实际上只是一个拉链,我解压缩并查看了。果然,那里有一个名为 "internet" 的目录,其中包含 38 个 class 个文件。

不知何故,我突然想到系统或 CLASSPATH 中还有另一个 javax.mail 条目,所以我查看了。这是 Fedora Core,所以它在 /usr/lib 下,我没有找到另一个文件,其名称中包含字符串 "mail",所以我认为也不是。

我注意到在 NOTES.txt 文件中有一些关于不为某些应用程序解压 jar 的说明,因为这被视为安全风险,但我认为对于我想做的事情没有这样的风险,也许它会起作用,但我也无法让它起作用......

我也一直在尝试使用 -cp 而不是实际更改 CLASSPATH 变量,但这似乎并不重要。无论哪种方式,我显然都得到了相同的结果,所以我一直在使用 -cp 进行测试,因为尝试各种替代方法会更快。

MimeMessage 在 javax.mail.internet 包中,您尚未导入。

提问者编辑:

实际上,我正在尝试导入,其中包括:

import javax.mail.internet;

那没有用。我缺少的是 javax.mail.internet 上没有什么可导入的。将其更改为:

import javax.mail.internet.*;

工作得很好!

所以,虽然 Bill 不是很正确,但这个答案加上他的评论让我看到了我看不到的东西......我觉得自己很傻!