这可能是一个非常基本的问题,但如果这是众所周知的并且已在别处解决,请帮助我。
我有一个多战设置(所有maven模块)说kilo-webapp1
和kilo-webapp2
作为我需要在Tomcat实例上部署的两个WAR。这两个webapp都使用来自公共服务jar的服务,比如kilo-common-services.jar
。 kilo-common-services.jar
有自己的spring上下文,由jar用户加载。在这种情况下,kilo-webapp1
和kilo-webapp2
。事实上,千公共服务中的服务初始化需要很长时间,因此我希望它只发生一次(以确保启动实例所需的时间不是很高)这也有助于我将它用作二级缓存,它在JVM实例中保持最新。为此,我们采取了以下步骤:
shared.loader
为${catalina.base}/shared/lib
kilo-common-services.jar
及其所有相关的jar复制到CATALINA_BASE/shared/lib
。 [手动步骤] CATALINA_BASE/shared/lib
位置[手动步骤] beanRefContext.xml
中创建了kilo-common-services.jar
个文件。在这里定义一个新的ClassPathXmlApplicationContext
,其中为构造函数提供了公共服务的spring上下文文件的位置。kilo-common-services.jar
和provided
pom文件中将kilo-webapp1
和所有其他依赖项(如Spring相关的jar)的依赖范围注释为kilo-webapp2
。对于Spring,需要确保类路径扫描操作不会被触发两次。如果没有通过ClassCastException
范围排除,这会导致不同的provided
s(对于log4j来说)。kilo-webapp1
和kilo-webapp2
的web.xml表明,他们的parentContext是servicesContext
中定义的kilo-common-services.jar
。我能够验证只存在公共服务的一个服务实例,但您可能想到的设置很痛苦。如果某人在像Eclipse这样的IDE中有关于这种设置的最佳实践,那将非常感激。我的问题如下:
mvn dependency:copy-dependencies
上运行kilo-common-services
,将相关的jars从target/dependency
复制到shared/lib
,这是一个非常糟糕的手动步骤。我一次又一次忘记重新生成依赖项,并且必须重新进行重新部署。随着时间的推移,将会有更多这种不同的共同罐子需要分享,这将涉及每个罐子的痛苦。随意批评设置,并提出一个更好的设置,可以很容易使用(从IDE也是如此)。很乐意提供任何其他细节。
提前致谢!
答案 0 :(得分:2)
问题在于您的架构已经崩溃(这就是您为解决方案而苦苦挣扎的原因)。你有两个解决方案:
1)如果您想在两个war应用程序之间共享需要很长时间(初始化)的服务,请将其作为一个单独的服务,并通过休息或任何类型的远程处理来访问它。
2)将两个webapp合并为一个。
拥有公共库是共享的lib文件夹会给你带来很多麻烦,你最终会回滚它。
我的(个人)方法是合并两个应用程序,但保持包足够分开并具有单独的弹簧配置。这样,至少你仍然保持两个webapps的逻辑分离。 此外,由于两者都在同一个容器上运行,因此进行2次单独战争几乎没有什么好处(除非你计划很快将它们移到不同的容器中)。
关于IDE,您可以使用maven-cargo-plugin启动一个带有几个Web应用程序的tomcat,几乎可以使用任何配置。
答案 1 :(得分:0)
我们正在开发宁静的soa,使用spring和tomcat并利用Domain Driven Design(无论如何都是计划)。有migrationProject和初始基本搜索服务。两个独立的WAR文件,带有两个独立的POM。两者都使用相同的Domain对象。
所以我将有一个单独的项目,它将只是DomainObjects我将它们包装到一个jar中,然后使用maven和/或jenkins它将自动部署(每当我配置时(例如当推送到特定的存储库时)
拥有同一个罐子的两个副本,对我来说听起来更糟糕。它不是你的架构坏了,它的部署和开发过程需要改进,imho。
(my kind of related question)。
我们的长期计划是将一个项目作为restful接口,使用多个控制器,从其依赖项中将服务类和存储库注入其中。