2013-02-28 79 views
1

我正在开发一个java web应用程序,它部署在tomcat 7上。 我在这个应用程序中使用Maven, Spring, spring security 3.0.5.RELEASE and JSF无法使用来自CATALINA_HOME/lib文件夹的Spring和Spring安全jar文件

我想将弹簧和jsf jar文件放在CATALINA_HOME/lib中,因为我也在其他应用程序中使用它们。现在我的战争档案中有大部分这些罐子。

我做了分离WAR文件罐的步骤如下:

  1. 加入<scope>provided</scope> tag依赖于pom.xml
  2. 将jar文件中CATALINA_HOME/lib

当我做这些步骤对于JSF jar,一切工作正常。
但是,当我做了同样的春季和春季安全罐子应用程序没有启动并抛出错误。

例如:如果我添加<scope>provided</scope>标签以下依赖我的应用程序停止工作,并抛出Caused by: java.lang.ClassNotFoundException: org.springframework.core.io.Resource异常:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>${spring.version}</version> 
</dependency> 

请参阅here完整的堆栈跟踪的pom.xmlhere

如何让我的webapp可以在CATALINA_HOME/lib中使用spring jar的地方?

回答

1

它通常是一个坏主意,把应用的jar你的tomcat lib目录。把他们全部留在你的战争中,以便他们只限于那个应用程序。如果你搜索,你会发现这个例外很多次。

人们做出的另一个常见错误(并不明显)是从JVM的角度来看类的标识是类名以及加载它的类加载器的标识。因此,如果两个类加载器加载相同的类,则不能将一个实例转换为另一个。

类加载器经常令人困惑,你最好坚持使用人们使用的标准方法。将所有应用程序罐放入您的WEB-INF/lib中,以便将它们与其他应用程序隔离开来,并确保在常用lib目录中没有任何重复的罐子。同时检查您的应用程序以确保您只有每个罐子的一个版本。

您通常需要在网络应用程序中标记为provided的唯一东西是servlet-api jar。

1

您遇到了类加载器问题。

您的某些类需要一些其他类加载另一个类加载器。

请参阅http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html了解更多信息。

试图让Spring摆脱战争(分享或最小化战争规模)似乎是一个好主意,但它会导致麻烦。

即使你管理,使其工作,你将最终与日志记录API一塌糊涂......

相关问题