即使软件包位于CLASSPATH中,javax.mail.MimeMessage也不可用
我正在尝试开发一个电子邮件分析器 - 用于获取文件中的电子邮件,并且能够以编程方式处理各种组件 - 知道发件人和收件人主题,主体和任何附件。我打算将附件提取为单个文件,但我一开始就陷入困境。即使软件包位于CLASSPATH中,javax.mail.MimeMessage也不可用
我在一个功能齐全的开发环境中开始了一个已经可以工作的java程序,并开始添加它。其中第一个添加的是这条线(再后来,集线):
import javax.mail.*;
import javax.mail.internet;
import javax.mail.internet.MimeUtility;
后来,在一个合适的地方,我们有这个不起眼的开始:
MimeMessage m = null;
我很震惊地发现,只有这两个更改会导致编译失败,并且I learned here(在另一个StackOverflow页面上)表示包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是一个可用的类。
我在做什么错?我的意思是,geez,自从1.0版本以来我一直在使用Java--我不知道犯了太多愚蠢的错误,但我想我一定是!
两个开放式的问题来我的脑海:)为什么没有使用
1安装JavaMail包的版本?很明显,我不得不添加它。并且请注意,我不必为CLASSPATH(或其他任何地方)做任何特殊的事情来获得Java的其余部分!和;
2)现在我已经有了一个JavaMail包,为什么它没有发现MimeMessage类?
任何/所有的帮助表示赞赏 - 如果你发现我是非常愚蠢的,请指出我的错误轻轻!
附加信息: 我增加了两条进口线,所以现在有三个上面列出。奇怪的是,当我在CLASSPATH指定的路径中有.jar文件但没有明确引用时,每次导入都会出现一个错误,但是当我明确引用.jar文件作为显式项时,我只会收到一个错误!那一个错误是:
import javax.mail.internet;
当然,知道这个罐子实际上只是一个拉链,我解压缩,看了看。果然,名为“互联网”的目录在那里,填充了38个类文件。
某处,我有一个疯狂的想法,不知何故在系统或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.*;
工作得很好!
因此,虽然比尔不是很正确,但是这个答案加上他的评论让我看到了我的盲目......我感到很傻!
我已经把这个问题放在一边 - 使用ripmime来完成大部分工作,现在我确实需要解决这个问题。事实证明,你错了,我实际上已经试图导入javax.mail.internet,更具体地说,是javax.mail.internet.MimeUtility。我将更新Q. –
上面只有“import javax.mail。*;”,是否添加了“import javax.mail.internet。*”?仅导入MimeUtility不会让您访问整个软件包。 –
我明白了,比尔,但任何使用这个班的人都将是一个重大的进步。目前它不会超过进口声明!除非你说我会通过导入所有东西来获得成功?!奇。但在这一点上,我会尝试任何事情。 –
你是如何将JAR添加到你的类路径中的? –
@TimBiegeleisen我只是把它放到CLASSPATH中已经有其他原因需要的库目录中。 –
执行Java应用程序的大多数方法实际上并不使用'CLASSPATH'环境变量来确定类路径。 –