无法在OSGi中访问javamail中的类

时间:2012-09-06 14:06:34

标签: osgi

我有一个OSGi包,我在其中使用java mail api来添加邮件功能。

我遇到的问题是,bundle类加载器没有在加载本地或全局类时创建的classpath变量中添加mail-1.4.jar和activation.jar的条目。

我在清单中的bundle classpath中添加了mail-1.4.jar和activation.jar,这些jar是简单的jar(不是OSGi包)。这些都在我的包中的lib目录中。 现在在加载javax.mail.Address类时抛出ClassNotFoundException。 这是我使用命令行运行我的应用程序时。

当我在Eclipse中运行它时,它完全正常。 我用equinox作为我的容器。 有什么建议吗?

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Workexp
Bundle-SymbolicName: com.gslab.workexp
Bundle-Version: 1.0.0
Bundle-Activator: com.gslab.workexp.Activator
Bundle-Vendor: GSLAB
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework
Bundle-ClassPath: .,
 lib/mysql-connector-java-5.1.20-bin.jar,
 lib/commons-beanutils-1.8.0.jar,
 lib/commons-collections-2.1.1.jar,
 lib/commons-digester-2.1.jar,
 lib/commons-javaflow-20060411.jar,
 lib/commons-logging-1.1.1.jar,
 lib/iText-2.1.7.jar,
 lib/jasperreports-4.6.0.jar,
 lib/jdt-compiler-3.1.1.jar,
 lib/log4j-1.2.9.jar,
 lib/mail-1.4.jar,
 lib/activation.jar

2 个答案:

答案 0 :(得分:0)

您对bundle classpath的使用很不寻常。您应该使用Import-Package(最佳实践)或Require-Bundle来实现依赖项。 Bundle classpath表示所有这些jar都打包在bundle archive中的lib文件夹中。我怀疑情况并非如此,即使是这样,你也完全绕过Eclipse给你的所有模块化。

尝试将“javax.mail”包添加到Import-Package标头中。有关Eclipse中不需要这个的原因的解释,请参阅i / Why_does_Eclipse_find_javax.swing_but_not_Felix%3F。

答案 1 :(得分:0)

确保已将lib文件夹包括在bin.includes(清单编辑器中的“构建”选项卡)内,否则它们将不会在最终的jar中导出。 这是一个非常烦人的“错误”,它可以在Eclipse中运行(因为文件可以在文件系统中访问),但是构建器将忽略不包含的文件。