为单个maven项目创建两个工件(war)

时间:2017-05-25 09:36:35

标签: java maven dependency-injection build war

我有一个Java Web项目,我们在两个不同客户的服务器上部署,99%的代码是相同的,现在我有两个ApplicationBuilders,它是包含每个客户的自定义的类。

任何时候我想要部署新版本我必须手动注释一行,构建(使用maven),取消注释该行,注释另一行并重新构建。

public class ApplicationBuilderFactory {
    private static final IApplicationBuilder app;

    static {
//            app = new Customer1ApplicationBuilder()
            app = new Customer2ApplicationBuilder();
        }
    }

    public static IApplicationBuilder get() { return app; }
}

我想避免这一切,最好的事情可能就是创造两场不同的战争。

这样做的好方法是什么?我不使用(也不喜欢)依赖注入框架,为单个类添加一个似乎有点过分,但我可能会考虑它。

2 个答案:

答案 0 :(得分:1)

创建2个不同的Maven配置文件,每个客户一个,在编译阶段之前将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 /主/爪哇/ PKG / ApplicationBuilderFactory.java.customer1
  • 的src /主/爪哇/ PKG / ApplicationBuilderFactory.java.customer2。

因此,在编译java代码之前,我们将其中一个版本复制到src / main / java / pkg / ApplicationBuilderFactory.java。

因此,使用2个不同的配置文件生成2个不同的.wars。

答案 1 :(得分:1)

解决此问题的一种方法是使用Maven WAR Plugin Overlays功能。

您可以创建一个基本WAR项目,然后为每个仅包含需要不同的组件的客户创建一个单独的WAR项目,而不是尝试从一个项目构建多个工件(一段时间后可能变得难以处理)。

每个客户特定的WAR将与基础WAR重叠。这样不仅可以更容易地定制ApplicationBuilderFactory,还可以定制特定的Web内容和资产。

这也有以下好处

  • 保证客户特定功能彼此隔离;

  • 不同的客户可以拥有自己的发布周期和源代码控制存储库

  • 添加后续客户很容易