在我们公司,我们有许多不同的模块构建为单独的战争。每个客户都可以挑选他想购买的模块。由于所有模块共享相同的会话、安全上下文等,因此将它们合并到单个战争中是有意义的。
是否有可能使这个过程自动化?例如,它应该合并 web.xml,计算每个 wars 的依赖关系,复制 .jsp 和 .class 等文件。顺便说一下,我们正在使用 Maven,但无法找到解决此问题的方法。
在我们公司,我们有许多不同的模块构建为单独的战争。每个客户都可以挑选他想购买的模块。由于所有模块共享相同的会话、安全上下文等,因此将它们合并到单个战争中是有意义的。
是否有可能使这个过程自动化?例如,它应该合并 web.xml,计算每个 wars 的依赖关系,复制 .jsp 和 .class 等文件。顺便说一下,我们正在使用 Maven,但无法找到解决此问题的方法。
考虑到 djna 和 ChssPly76 提到的风险,您可以通过使用Maven WAR 插件的覆盖来实现这一点。这将要求您分离出 servlet 映射以确保您没有任何 URL 冲突等,但它可能会成功。
基本上,您创建一个具有多个 WAR 依赖项的模块并使用插件将它们合并到一个新的模块中。
我记得cargo-maven2-plugin有一个uberwar
魔力。我没有使用过它,但我知道它旨在合并战争,但您需要小心避免冲突。
对源的快速扫描表明您定义了一个merge descriptor
来确定如何合并战争。不幸的是,文档站点已丢失,因此我无法为您提供更多详细信息。
您可以查看Codehaus Jira网站以了解其当前状态。
要使用插件,您需要指定如下配置:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0</version>
<extensions>true</extensions>
<configuration>
<descriptor>merge.xml</descriptor>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>project1.groupId</groupId>
<artifactId>project1</artifactId>
<type>war</type>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>project2.groupId</groupId>
<artifactId>project2</artifactId>
<type>war</type>
<version>1.2.0</version>
</dependency>
</dependencies>
(仍在寻找 merge.xml 示例)
这样做显然是可能的,但我认为您最好首先处理单个 WAR。对我来说,后期对 WAR 内容的“挑选和混合”听起来像是一场噩梦。
EAR 旨在容纳多种东西。这对你来说有可能吗?
编辑:首先,让我们假设没有重复的资源(哪个应该放在最终的 jar 中?)并且所有 jar 都是兼容的(每个库只有一个版本等)。
您应该可以只复制 WEB-INF/ 的内容,除了需要仔细合并的各种 XML 文件。最简单的方法可能是使用 XSLT 样式表,它允许您保存两个 XML 文档并将它们合并(如果我没记错的话,这是标签)。您需要为每个 xml 文件创建一个,以便确定您正确执行此操作 - 只需考虑 JSF 导航。
所以,我的建议是一个简单的资源副本和一个手工制作的 XSLT 样式表 pr xml 配置文件。
一般来说 - 不,这是不可能的。如果您有重复的 JSP 名称怎么办?Servlet 名称/映射?加载不同参数的相同上下文侦听器(如果您使用 Spring / Struts / 等则很常见)?你明白了。
在您的特定情况下,根据您的具体情况,可能会也可能不会。提取战争和复制 JSP/类/库很容易;合并 web.xml 有点复杂,因为您必须维护元素顺序 - 手动定义“合并的”web.xml 可能更容易。