是否可以使用class.forname加载与Spring连接的模块中存在的类?

时间:2010-09-26 19:55:37

标签: spring maven-2 jboss java-ee

我有两个maven模块,需要模块1中的A类才能使用class.forname在模块2中加载B类。这非常有效,我可以在B类上调用正确的方法完全没问题。模块1使用弹簧连接,我想以相同的方式连接模块2以保持一致性。我尝试了这个,并没有编译它。但是当我尝试运行代码时,我遇到了很多问题。首先,它找不到各种弹簧类,如ApplicationContext。依赖关系存在于模块2的pom中。为了解决这个问题,我必须将所有的spring jar添加到JBoss中的lib文件夹中。

一旦添加它们似乎就可以清除这些问题,但后来我遇到了以下问题: -

  

org.springframework.beans.FatalBeanException:名称空间[http://www.springframework.org/schema/util]的类[org.springframework.beans.factory.xml.UtilNamespaceHandler]未实现[org.springframework] .beans.factory.xml.NamespaceHandler] interface

我无法理解为什么。我想做的是什么?

1 个答案:

答案 0 :(得分:2)

这不是Maven或Spring的问题,因为它们都没有做任何类路径魔术。这是您的部署和打包问题。

验证pom.xml中是否已将这两个模块声明为范围运行时(或默认值)。您打包的.war.ear应包含模块jar文件及其依赖项。永远不要将任何库复制到服务器的lib文件夹,除非你真的知道你在做什么。

同时验证您的最终存档不得包含重复条目!这非常重要。如果您使用Spring,请确保您没有spring.jar,但只有应用程序存档中的spring-xxxxx.jar文件。如果您有spring-beans.jarspring.jar,则poml.xml中的依赖关系管理出错了。还要删除添加到服务器lib文件夹中的Spring库。

验证依赖项的版本。虽然Maven应该保护您免受大多数错误的影响,但请确保您的类路径中没有任何具有多个版本的库。

如果您使用的是Class.forName(String),则应该使用应用程序的Class.forName(String,ClassLoader)代替ClassLoader。 Imho ClassLoader使用的默认Class.forName()是线程的ContextClassLoader(TCCL)。不确定这是否适合您的情况。如果您使用任何执行动态类加载或编织等的框架,您可以尝试自己设置TCCL。

如果全部失败,另一个选项是检查是否需要反转JBoss的ClassLoader委派模型。见JBoss Class Loader HOW-TO