我有十个WAR文件,所有这些文件都有几乎相同的代码和标记。唯一的区别在于图像,CSS和消息。我点击了Profiles的概念,但我还没有完全理解它,我不确定这是否可以处理我需要它做的事情。
基本上,我想要一个具有10种不同WAR的不同配置文件的基础项目。每当使用给定的配置文件启动构建时,它就会进入存储库(本地或我的组织)并检索CSS,图像和消息文件,并在完成该过程之前将它们放在正确的位置。我无法想象这与外出并检索JAR文件并将其放入WEB-INF lib有很大不同。
我确信这在左场不太远,我想尽可能地坚持Maven的甜蜜点。任何帮助将不胜感激!
答案 0 :(得分:4)
如果要将每个项目分开,可以为每个项目提供自己的pom.xml。在每个子项目pom中,为父项目添加依赖项。这将导致构建执行“覆盖”,其中子项目中的文件被添加到(或覆盖)父项目中的文件。子项目的示例依赖项:
<dependency>
<groupId>com.example.app</groupId>
<artifactId>example</artifactId>
<version>1.0.0</version>
<type>war</type>
</dependency>
答案 1 :(得分:1)
配置文件应该非常适合这种情况。根据{{3}}的信息,这不应该奏效。具体来说,他们说
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中,您需要为每个网络应用添加个人资料。例如,在我的测试中,我做了以下事情:
<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应用程序中使用的所有元素。
最后,在构建时,您将指定要构建的Web应用程序的配置文件,例如 mvn -P abc clean install
您可能遇到的一个大问题是每个构建的工件都具有相同的名称,并且一个将覆盖本地存储库中的另一个。
答案 2 :(得分:1)
我可以考虑基于配置文件的解决方案,maven war插件和过滤,如Adding and Filtering External Web Resources中所述。
但这并没有回答如何将网络资源用作“依赖关系”部分问题。
为此,How to share resources across projects in Maven博客文章描述的内容非常接近,可能有所帮助。
答案 3 :(得分: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存储库中共存,而不会出现任何问题。
答案 4 :(得分: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版本的资源包。如果您没有与war一起发布资源包,那么您可以明确地指定版本。
HTH
ste