我正在开发一个使用 Geotools 的应用程序,它又使用 Java 高级成像 (JAI) API 在 Glassfish 下运行。当我从 Netbeans 将我的应用程序作为 EJB jar 文件运行时,由于 CDI 扫描期间出现 ClassNotFoundException 而无法部署:
com.google.common.collect.ComputationException: org.jboss.weld.resources.spi.ResourceLoadingException: Error loading class org.autogena.skyserver.data.filetypes.SwathFile
at com.google.common.collect.ComputingConcurrentHashMap.compute(ComputingConcurrentHashMap.java:218)
....
Caused by: org.jboss.weld.resources.spi.ResourceLoadingException: Error loading class org.autogena.skyserver.data.filetypes.SwathFile
at org.jboss.weld.resources.ClassTransformer.loadClass(ClassTransformer.java:189)
.....
Caused by: java.lang.NoClassDefFoundError: javax/media/jai/PropertySource
at java.lang.ClassLoader.defineClass1(Native Method)
....
Caused by: java.lang.ClassNotFoundException: javax.media.jai.PropertySource
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
但是,如果我将 EJB 模块打包到 EAR 文件中,则不会出现上述异常,并且似乎可以正常加载。
由于在 Mac 上 JAI 核心类在系统扩展库中,我很困惑它没有出现在类路径上。
在类加载方面,EJB jar 和 EAR 文件之间是否有区别,或者这在 Glassfish/Weld 中是否很大?
想一想 - glassfish 是如何找到我的项目使用的库的 - 它们似乎没有被打包到 ejb jar 文件中 - netbeans 在这里做了一些聪明的事情吗?
谢谢,乔什