无法在OSGi中访问javamail中的类

无法在OSGi中访问javamail中的类,osgi,Osgi,我有一个OSGi包,我在其中使用java邮件api来添加邮件功能 我面临的问题是,bundle类加载器没有在类路径变量中添加mail-1.4.jar和activation.jar的条目,该变量是在加载本地或全局类时创建的 我在manifest中的bundle类路径中添加了mail-1.4.jar和activation.jar,这些jar是简单的jar(不是OSGi bundle)。这些都在我包的lib目录中。 现在,在加载javax.mail.Address类时,抛出ClassNotFoundE

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

我面临的问题是,bundle类加载器没有在类路径变量中添加mail-1.4.jar和activation.jar的条目,该变量是在加载本地或全局类时创建的

我在manifest中的bundle类路径中添加了mail-1.4.jar和activation.jar,这些jar是简单的jar(不是OSGi bundle)。这些都在我包的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

使用bundle类路径是不寻常的。您应该使用导入包(最佳实践)或需要依赖项的捆绑包。Bundle classpath表示所有这些jar都打包在Bundle归档中的lib文件夹中。我怀疑事实并非如此,即使是这样,您也将完全绕过Eclipse提供的所有模块化


尝试将“javax.mail”包添加到导入包头中。有关为什么Eclipse中不需要此项的解释,请参阅i/why\u Eclipse\u find\u javax.swing\u but\u not\u Felix%3F。

确保您已将lib文件夹包含在bin.includes(清单编辑器中的Build选项卡)中,否则它们将不会导出到最终的jar中。
这是一个非常恼人的“bug”,它在eclipse中工作(因为文件系统中可以访问这些文件),但构建器将忽略未包含的文件。

您应该为包发布META-INF/MANIFEST.MF。通常独立的JAR本身不是Bundle,必须放在MANIFEST.MF的Bundle类路径条目中。还有,你确定这只是一个CNFE而不是NoClassDefFoundError吗?发布整个堆栈跟踪。是的,确定是CNFE。抱歉,无法发布堆栈跟踪,因为它未显示在控制台上。我使用eclipse进行了远程调试,在调用delegate.findclass for javax.mail.Address时看到了CNFE。另一个尝试是启用调试,以便Equinox显示正在加载哪些类以及从何处加载。查看以设置日志记录。正如我前面提到的,我使用JDWP远程调试应用程序,并看到在加载javax.mail.Address类时,它抛出了CNFE,stacktrace值为null。是的,但您将看到它抛出CNFE的原因。您将明确看到哪个捆绑包试图加载该类。请记住,OSGi类加载在捆绑包之间的“连接”意义上更为复杂。我同意最佳实践。但是mail.jar放在我的bundle归档中的lib文件夹中。必须没有CNFE。对于启动OSGi时提到的问题,我使用java-Dosgi.compatibility.bootdelegation=true。您是否同时指定bootdelegation属性并将jar打包到包中?然后,您的包可能会看到javax.mail包的两个副本,这是解决奇怪的类路径问题的好方法。怎么会有两份?。。rt.jar没有javax.mail。您说过jar位于“类路径”上。这将创建两个副本:一个通过类路径,一个通过OSGi包类路径。Bundle类路径和“Classpath”是非常不同的东西。