部署基于Spring的WAR及其JAR依赖项外部化

时间:2009-07-08 20:13:34

标签: java spring deployment tomcat

我有一个Spring应用程序,它有很多依赖项(18兆字节的JAR文件..) - 现在,当我在远程Tomcat 6.0服务器上测试时,我不想上传那19兆字节的依赖项,只需上传类。很简单吧?

我无法得到该死的东西。

我正在使用Eclipse 3.4,如果在Java Build Path-> Order and Export中删除了所有依赖项的导出,我会得到一个不错的小WAR。

所以这就是我的尝试:

我将所有的lib上传到服务器,并将它们放在Tomcat的common / lib中。该目录不存在,所以我创建了它并修改了catalina.properties:

shared.loader=${catalina.home}/common/lib/*.jar

我尝试过其他一些配置,但都没有用。重启服务器,部署战无法启动。具体做法是:

SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderList$java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener       at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1

它正在试图加载Log4J监听器,它在类路径中找不到它。监听器所在的弹簧库是共同的/ lib。

此外 - 当我部署完整的18兆字节战争时,它运作得很好。所有内容和应用程序启动。当然它也适用于本地。

哦 - 我已将硬编码的日志记录JAR替换为extras文件夹中的那些,以允许Log4j工作。

这里有什么帮助吗?我不知道为什么这不起作用。

8 个答案:

答案 0 :(得分:4)

“我有一个拥有大量依赖关系的Spring应用程序(18兆字节的JAR文件......) - 现在,当我在远程Tomcat 6.0服务器上进行测试时,我不想上传19兆字节依赖项,只需上传类。非常简单,对吧?“

我不明白这一点 - 19MB 很多。你只需要打包一个WAR就好了。

我建议您在自己的相同Tomcat实例上进行本地测试,将其全部工作,然后将WAR部署到远程Tomcat实例。

更新:我将这些JAR放在Tomcat的/ lib目录中的一个问题是,现在您部署到该实例的每个应用程序都会看到这些JAR - 将它们更改为一个,所有这些都受到影响。如果将JAR放在每个WEB-INF / lib中,则可以修改每个应用程序而不影响其他应用程序。成本是重复的JAR和磁盘空间,这很便宜。

如果您必须从devl-> test-> prod迁移,另一个问题是,现在每个环境都必须部署相同的JAR才能使您的应用正常工作。想念一个,你就被打破了。您的应用程序取决于是否具有这些依赖项。如果他们不在服务器上,那你就不走运了。保持控制权并将JAR打包在WAR文件中。

答案 1 :(得分:1)

您需要小心外部化Web服务器环境中的依赖关系。根据服务器的不同,即使看起来很好,也会出现意外的类加载问题。

我同意duffymo ...... 19MB真的不是那么大......有什么理由背后想要这样做吗?我不推荐它。

答案 2 :(得分:1)

找到webapp文件夹

将文件直接上传到文件夹

例如

/ path-to-tomcat / webapp / myapp /

保留/ path-to-tomcat / webapp / myapp / WEB-INF / lib文件夹并将更改上传到ur / path-to-tomcat / webapp / myapp / classes文件夹

然后使用tomcat manager重启应用程序

答案 3 :(得分:1)

我的建议是直接向$ {CATALINA_HOME} / webapps /< your-app>发送更新在目标服务器上。 WAR适用于生产部署,但如果您的连接速度较慢且WAR较大,则无效。

当然,您希望在更新后重新启动Web应用程序。处于开发模式的Tomcat将监视一些文件的更改;默认情况下,WEB-INF / web.xml就是其中之一,所以更新它以及你正在更新的其他内容,你很快就会重新启动应用程序。在紧要关头,您可以使用Manager Web应用程序唤醒应用程序。

为了获得更多控制和便利,您最终可以使用Tomcat ant任务(位于Tomcat发行版附近,不包含在ant!中)来重新启动服务器,也可以部署您的更改。需要进行一些调整,但这非常值得,因为您需要为每个项目重复使用它。

答案 4 :(得分:0)

  1. WEB-INF / lib是空的吗?
  2. log4j.jar在哪里?
  3. spring.jar在哪里?
  4. 这看起来像是类加载器可见性问题。

答案 5 :(得分:0)

听听duffymo和cjstehno。

将jar添加到tomcat是灾难的必然方法。

将您的jar放在您的webapps目录中。

答案 6 :(得分:0)

Tomcat无法找到jar文件,这很奇怪。无论如何,将所有jar放在公共文件夹($ {catalina.home} / lib)中。 (这比使用shared.folder更糟糕,但它应该适合你)。

当然,和其他人一样,你不应该在生产系统中这样做。我相信对于开发系统来说这是可以的 - 特别是如果你需要对生产系统进行大量测试的话。

另一个注意事项:只有完全控制服务器并且您是唯一安装应用程序的人才能执行此操作。

答案 7 :(得分:0)

为什么要更改tomcat的默认$ {shared.loader}属性?