4

我有十个 WAR 文件,所有这些文件都有几乎相同的代码和标记。唯一的区别在于图像、CSS 和消息。我想到了 Profiles 的概念,但我还没有完全理解它,我不确定这是否能处理我需要它做的事情。

基本上,我想要一个针对 10 种不同 WAR 具有不同配置文件的基础项目。每当使用给定配置文件开始构建时,它都会转到存储库(本地或我的组织的)并检索 CSS、图像和消息文件并将它们放置在正确的位置,然后再完成该过程。我无法想象这与出去检索 JAR 文件并将其放入 WEB-INF 库有很大不同。

我敢肯定这在左场并不太远,我想尽可能地坚持 Maven 的最佳位置。任何帮助,将不胜感激!

4

5 回答 5

4

如果您想将每个项目分开,您可以为每个项目提供自己的 pom.xml。在每个子项目 pom 中,为父项目添加一个依赖项。这将导致构建执行“覆盖”,其中来自子项目的文件被添加到(或覆盖)父项目中的文件。子项目的示例依赖项:

<dependency>
   <groupId>com.example.app</groupId>
   <artifactId>example</artifactId>
   <version>1.0.0</version>
   <type>war</type>
</dependency>
于 2009-10-19T18:57:49.897 回答
2

我可以考虑基于配置文件、maven war 插件和过滤的解决方案,如添加和过滤外部 Web 资源中所述。

但这并不能回答如何将网络资源用作您问题的“依赖项”部分。

为此,如何在 Maven博客文章中跨项目共享资源描述了一些非常接近的内容并且可能会有所帮助。

于 2009-10-14T22:16:47.320 回答
1

配置文件应该非常适合这个。根据Maven 构建配置文件文档中的信息,这应该不起作用。具体来说,他们说

build as specified inside of a profile is not a full implementation of the traditional
build POM element. This build is really another class in the model - from which the POM
build is derived - and only allows the plugins and pluginManagement subelements when 
defined here. This sidesteps any issues with secondary validation after the pom.xml is 
parsed in this case.

但我只是对其进行了测试,它通过在内部包含一个带有资源定义的构建元素来包含适当的资源。

在您的 pom 中,您需要为每个 webapps 包含一个配置文件。例如,在我的测试中,我做了以下事情:

<profile>
    <id>abc</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <build>
        <resources>
            <resource>
                <directory>abc</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
    </build>
</profile>
<profile>
    <id>xyz</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <build>
        <resources>
            <resource>
                <directory>xyz</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
    </build>
</profile>

然后,我有一个目录 abc,其中包含一个文件 abc.properties,另一个 xyz 具有相应的 xyz.properties 文件。

对于所有共享资源,您将拥有一个元素,该元素还具有一个包含您希望在每个 web 应用程序中使用的所有资源的元素。

最后,当您构建时,您将指定要构建的 webapp 的配置文件,例如 mvn -P abc clean install

使用这种方法可能会遇到的一个大问题是,构建的每个工件都将具有相同的名称,并且其中一个会覆盖本地存储库中的另一个。

于 2009-10-14T21:57:23.290 回答
0

是的,我要两次回答这个问题,因为每种方法都有很大的不同。

您可以拥有一个包含 11 个模块的项目,而不是拥有一个包含每个 war 文件的配置文件的 pom.xml。一个具有所有共享源的 maven 模块,然后您的每个 war 文件将是另一个仅具有特定于它的文件的相邻模块。所有这些模块都在一个根 pom 下。

在每个 war 模块的 pom 中,您将在构建配置中设置资源和 sourceDirectory 以指向 ../base-project/src/main/resources 和 ../base-project/src/main/java分别。

然后,maven-war-plugin 配置将设置 webResources 以指向 ../base-project/src/main/webapp 和 ./src/main/webapp 中的特定战争资源。

使用此解决方案,您将为每个 war 文件拥有不同的 maven 工件,并且它们都可以在您的 .m2 存储库中共存而不会出现任何问题。

于 2009-10-14T22:11:02.687 回答
0

您始终可以使用 maven-remote-resources-plugin。您将为每个资源集创建子模块构建,例如创建一个名为“my-project-resources-customer1.jar”的子模块。这些就像任何其他 Maven 工件一样,可以放在您的本地或远程存储库中。

在您的 war 构建中,您将拥有如下所示的插件配置,它将将指定资源包 jar 的内容分解到您的目标目录,然后将它们包含在您的 war 文件中。此配置可以通过设置属性“profilename”以选择所需资源的配置文件轻松控制。

<plugin>
    <artifactId>maven-remote-resources-plugin</artifactId>
    <executions>
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>process</goal>
        </goals>
        <configuration>
          <resourceBundles>
            <resourceBundle>org.mygroup:my-project-resources-${profilename}:${pom.version}</resourceBundle>
          </resourceBundles>
        </configuration>
      </execution>
    </executions>
  </plugin>

如果您使用的是 maven 发布插件,一个警告(这是一个小警告)是要小心如何指定资源版本。如果您的资源和 war 文件共享一个通用版本,您将需要在插件中使用 ${pom.version} 属性。然后,当发布插件将您的父版本更新为 1.1 时,插件将自动反映这一点,使用 1.1 版本的资源包。如果您没有与战争同步发布资源包,那么您可以明确指定版本。

高温高压

斯特

于 2009-11-16T18:48:45.217 回答