为单个 Maven 项目创建两个工件 (war)
Create two artifacts (war) for a single maven project
我有一个 Java web 项目部署在两个不同客户的服务器上,99% 的代码是相同的,现在我有两个 ApplicationBuilder,即 class其中包含每个客户的定制。
任何时候我想部署新版本我都必须手动注释一行,构建(使用 maven),取消注释那一行,注释另一行并再次构建。
public class ApplicationBuilderFactory {
private static final IApplicationBuilder app;
static {
// app = new Customer1ApplicationBuilder()
app = new Customer2ApplicationBuilder();
}
}
public static IApplicationBuilder get() { return app; }
}
我想避免这一切,最好的办法可能只是制造两场不同的战争。
执行此操作的好方法是什么?我不使用(也不喜欢)依赖注入框架,只为单个 class 添加一个框架似乎有些过分,但我可能会考虑它。
创建 2 个不同的 Maven 配置文件,每个客户一个,在编译阶段之前将 class ApplicationBuilderFactory 的一个版本复制到正确的目录。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>copy-files</id>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target name="copy files">
<copy file="${project.build.sourceDirectory}/pkg/ApplicationBuilderFactory.java.${extension}" tofile="${project.build.sourceDirectory}/pkg/ApplicationBuilderFactory.java" />
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>customer1</id>
<properties>
<extension>customer1</extension>
</properties>
</profile>
<profile>
<id>customer2i</id>
<properties>
<extension>customer2</extension>
</properties>
</profile>
而不是只有一个 src/main/java/pkg/ApplicationBuilderFactory.java,我们有:
- src/main/java/pkg/ApplicationBuilderFactory.java.customer1
- src/main/java/pkg/ApplicationBuilderFactory.java.客户2。
因此在编译 java 代码之前,我们将其中一个版本复制到 src/main/java/pkg/ApplicationBuilderFactory.java.
因此使用 2 个不同的配置文件生成 2 个不同的 .wars。
解决此问题的一种方法是使用 Maven WAR Plugin Overlays 功能。
您可以创建一个基础 WAR 项目,然后为每个客户创建一个单独的 WAR 项目,而不是尝试从一个项目构建多个工件(这会在一段时间后变得笨拙)只包含需要不同的组件。
每个客户特定 WAR 将与基础 WAR 重叠。这不仅可以更轻松地自定义 ApplicationBuilderFactory,还可以更轻松地自定义特定的 Web 内容和资产。
这还有以下好处
客户特定功能保证相互隔离;
不同的客户可以有自己的发布周期和源代码控制存储库
添加后续客户很容易
我有一个 Java web 项目部署在两个不同客户的服务器上,99% 的代码是相同的,现在我有两个 ApplicationBuilder,即 class其中包含每个客户的定制。
任何时候我想部署新版本我都必须手动注释一行,构建(使用 maven),取消注释那一行,注释另一行并再次构建。
public class ApplicationBuilderFactory {
private static final IApplicationBuilder app;
static {
// app = new Customer1ApplicationBuilder()
app = new Customer2ApplicationBuilder();
}
}
public static IApplicationBuilder get() { return app; }
}
我想避免这一切,最好的办法可能只是制造两场不同的战争。
执行此操作的好方法是什么?我不使用(也不喜欢)依赖注入框架,只为单个 class 添加一个框架似乎有些过分,但我可能会考虑它。
创建 2 个不同的 Maven 配置文件,每个客户一个,在编译阶段之前将 class ApplicationBuilderFactory 的一个版本复制到正确的目录。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>copy-files</id>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target name="copy files">
<copy file="${project.build.sourceDirectory}/pkg/ApplicationBuilderFactory.java.${extension}" tofile="${project.build.sourceDirectory}/pkg/ApplicationBuilderFactory.java" />
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>customer1</id>
<properties>
<extension>customer1</extension>
</properties>
</profile>
<profile>
<id>customer2i</id>
<properties>
<extension>customer2</extension>
</properties>
</profile>
而不是只有一个 src/main/java/pkg/ApplicationBuilderFactory.java,我们有:
- src/main/java/pkg/ApplicationBuilderFactory.java.customer1
- src/main/java/pkg/ApplicationBuilderFactory.java.客户2。
因此在编译 java 代码之前,我们将其中一个版本复制到 src/main/java/pkg/ApplicationBuilderFactory.java.
因此使用 2 个不同的配置文件生成 2 个不同的 .wars。
解决此问题的一种方法是使用 Maven WAR Plugin Overlays 功能。
您可以创建一个基础 WAR 项目,然后为每个客户创建一个单独的 WAR 项目,而不是尝试从一个项目构建多个工件(这会在一段时间后变得笨拙)只包含需要不同的组件。
每个客户特定 WAR 将与基础 WAR 重叠。这不仅可以更轻松地自定义 ApplicationBuilderFactory,还可以更轻松地自定义特定的 Web 内容和资产。
这还有以下好处
客户特定功能保证相互隔离;
不同的客户可以有自己的发布周期和源代码控制存储库
添加后续客户很容易