如何将战争合二为一?

时间:2009-10-07 17:39:36

标签: java maven-2 java-ee packaging war

在我们公司,我们有许多不同的模块构建为单独的战争。 每个客户都可以挑选他想要购买的模块。 由于所有模块共享相同的会话,安全上下文等,因此将它们合并为单个战争是有意义的。

是否可以自动执行此过程?例如,它应该合并web.xml,计算每个wars依赖项,复制像.jsp和.class等文件。顺便说一下,我们使用的是Maven,但是无法找到解决这个问题的方法。

6 个答案:

答案 0 :(得分:8)

当djna和ChssPly76提到的风险时,你可以通过使用Maven WAR plugin的叠加来实现这一点。这将要求您分离出servlet映射以确保您没有任何URL冲突等,但它可能会起到作用。

基本上,您创建一个具有多个WAR依赖项的模块,并使用该插件将它们合并为一个新模块。

答案 1 :(得分:4)

我记得cargo-maven2-plugin有一个uberwar mojo。我没有使用它,但我知道它旨在合并战争,但你需要小心避免冲突。

快速扫描来源表示您定义merge descriptor以确定如何合并战争。不幸的是,documentation site已经丢失了,所以我无法再向您提供任何细节。

您可以查看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示例)

答案 2 :(得分:1)

显然可以做到这一点,但我认为你最好先在一个WAR上工作。战争内容的后期“挑选和混合”对我来说就像支持噩梦一样。

答案 3 :(得分:1)

EAR旨在容纳多种东西。这对你有用吗?


编辑:首先,让我们假设没有重复的资源(哪一个应该放在最后的jar中?)并且所有的jar都是兼容的(你只有每个库的一个版本等)。

除了需要仔细合并的各种XML文件之外,您应该只能将WEB-INF /的内容复制到彼此之上。最简单的方法是使用XSLT样式表,它允许您保存两个XML文档并合并它们(如果我没记错,这是标记)。每个xml文件都需要一个,以便能够正确地执行此操作 - 只需考虑JSF导航。

因此,我的suggetsion是一个简单的资源副本和一个手工制作的XSLT样式表pr xml配置文件。

答案 4 :(得分:0)

一般来说 - 不,这是不可能的。如果您有重复的JSP名称怎么办? Servlet名称/映射?相同的上下文侦听器加载不同的参数(如果你使用的是Spring / Struts / etc ......)?你明白了。

在您的特定情况下,根据您的具体情况,可能会或可能不会。提取战争并复制JSP /类/库很容易;合并web.xml有点复杂,因为你必须维护元素顺序 - 手动定义“合并”web.xml可能更容易。

答案 5 :(得分:-1)

你可能能够使用One-Jar。

http://one-jar.sourceforge.net/

它可能没有你想要的一切。