Java Maven-部署大型war文件

Java Maven-部署大型war文件,java,maven-2,deployment,tomcat,Java,Maven 2,Deployment,Tomcat,这个问题有点类似于这个,所以它是一个很好的阅读第一,但继续阅读我的q,它的不同在最后 使用maven 2,我的war文件非常大(60M)。我将它们部署到一组tomcat服务器上,仅仅复制文件就需要花费太长的时间(每次战争大约需要100万个文件) 在此基础上,我添加了一个RPM层,将war打包到一个RPM文件中(使用maven的RPM插件)。当RPM在目标机器上执行时,它将清理“安装”war(只需复制它),停止并启动tomcat(我们在这里就是这样做的,没有热部署),并在适当的位置设置适当的上下文

这个问题有点类似于这个,所以它是一个很好的阅读第一,但继续阅读我的q,它的不同在最后

使用maven 2,我的war文件非常大(60M)。我将它们部署到一组tomcat服务器上,仅仅复制文件就需要花费太长的时间(每次战争大约需要100万个文件)

在此基础上,我添加了一个RPM层,将war打包到一个RPM文件中(使用maven的RPM插件)。当RPM在目标机器上执行时,它将清理“安装”war(只需复制它),停止并启动tomcat(我们在这里就是这样做的,没有热部署),并在适当的位置设置适当的上下文文件。这一切都很好。
然而,问题是RPM文件太大,复制速度太慢。占据几乎整个空间的自然是战争文件

我还没有看到任何现成的解决方案,所以我正在考虑自己实现一个,所以我将在下面对其进行描述,希望这个描述能够帮助解释这个问题域。我很高兴听到你对计划中的解决方案的想法,更好的是告诉我其他现有的解决方案和随机提示

war文件包含:

  • 应用程序罐
  • 第三方罐
  • 资源(属性文件和其他资源)
  • WEB-INF文件,如JSP、WEB.xml、struts.xml等
  • 大部分空间被第三方JAR#2占据。
    第三方JAR也安装在公司内部的nexus服务器上,因此我可以利用这一点

    您可能已经猜到了,所以计划是创建瘦战争,只包括应用程序JAR(我公司编写的)、资源和WEB-INF内容,并向RPM安装脚本添加smartness,以便在需要时复制第三方JAR。
    RPM允许您在安装之前或之后运行任意脚本,因此计划在构建war时使用mvn编写第三方依赖项列表,并将其作为资源添加到RPM,然后在安装RPM时,RPM安装脚本将在所需第三方JAR列表上运行,并仅在以下情况下从nexus下载新JAR:它们还不存在。
    如果不使用JAR,RPM将不得不删除它们。
    RPM还必须为tomcat重建战争以使其爆炸,或者将第三方JAR添加到common/lib或类似的东西中,尽管我们每个tomcat都有一些web应用程序,所以从这个意义上讲,这将使事情变得复杂。可能会自行分解jar,然后将第三方jar复制到WEB-INF/lib


    非常感谢您的意见:)

    我反对您提出的计划。这听起来像是很多运动部件,当它们出现时,很难测试和/或诊断问题

    我们没有“大型”战争的问题,但我们确实有一个问题,我们的大多数战争在其类路径上都需要完全相同的第三方库。我们提出的解决方案(效果很好)是利用OSGi模块化地构建我们的应用程序。我们使用Felix作为在Tomcat内部运行的OSGi容器。然后,我们将所有依赖项/库部署到Felix一次。然后,我们部署“精简”WAR,通过从它关心的捆绑包中导入它需要的包来引用OSGi依赖项

    这还有一些其他优势:

    • 在旧版本的OSGi捆绑包运行时部署新版本并不是一个不允许停机的问题(类似于热部署)
    • 如果您需要升级一个依赖项(例如Spring2.5->3.0),您只需要升级OSGi中运行的SpringBundle;如果API没有改变,就不需要交付(或打包)新的WAR。这一切(再次)都可以在实时运行的OSGi容器上完成,无需关闭任何功能
    • OSGI保证您的包不会共享类路径。这有助于保持代码的整洁,因为每一场战争只需要知道它关心什么
    将您的战争设置为“OSGi就绪”并不是一件小事,但它有很好的文档记录。尝试查看或仅通过谷歌搜索第三方教程。相信我,最初的投资将为你节省很多时间和未来的许多麻烦


    如果可能的话,最好不要重新发明模块化控制盘。

    我们在目标机器上有一个目录,其中包含我们正在使用的所有第三方jar(大约110Mb)。jar使用的命名编码约定包括其版本号(asm-3.2.jar、asm-2.2.3.jar…)。当添加第三方的新版本时,我们不会删除旧版本

    部署时,我们的jar文件只包含我们在构建中编译的业务逻辑类和资源(没有第三方)。类路径是在中定义的,我们可以从中选择它在运行时应该使用的第三方。我们使用ant来实现这一点,没有maven参与,我们的系统中有超过25种类型的服务(非常“soa”,尽管我不喜欢这个过于冗长的词)。当启动流程时,业务逻辑jar是jvm类路径中唯一的jar,它的版本也由我们的代码repo修订号控制。如果您回到旧版本(回滚),我们的代码可能使用旧的第三方jar,它仍然可以工作,因为我们不删除旧的jar。新的第三方JAR应该在使用它们的业务代码之前传播到生产机器。但一旦它们到达那里,它们就不会在每次部署中被重新推送


    总体而言,我们倾向于简单(即不使用OSGi),我们不使用Maven。

    我正在考虑添加OSGi支持,但我必须诚实地说,首先,它不能完全解决端到端的问题,因为我必须将所需的JAR(捆绑包)复制到OSGi容器,其次,osgi是一个复杂的野兽,我仍然不知道它是否值得我和其他同事的努力。但是你提供的指针我绝对有用,所以谢谢!艾希,谢谢,简单当然是值得的。我看了一下OSGi,虽然它有一些优点