Maven 2 根据配置文件替换类的实现

4
我有一个名为MailTransport.java的类,它有两个子类:LiveMailTransport.javaTestMailTransport.javaLiveMailTransport将真正发送电子邮件,而TestMailTransprot仅将其写入日志以进行测试。
在某个地方,我使用了new MailTransport();,我想用Maven替换我的服务器端代码中MailTransport的每个实例,用编译时所用的配置文件(本地、生产等)分别替换成Live-TestMailTransport
(类似于客户端"gwts“replace-with")。
我该如何用Maven实现这一功能?

你是否在使用 src/main/java 和 src/test/java? - khmarbaise
@khmarbaise:是的,但是我们有很多用于测试服务器、持续集成等的配置文件,具有不同的邮件传输实现方式。 - Stuck
听起来你需要一个针对接口的单一测试套件,可以与多个不同的实现一起使用。 - khmarbaise
这个问题与测试无关,而是关于在源代码中替换用于不同环境的类/实现,就像使用Maven的策略模式一样。 - Stuck
正如我之前所写的,这是 DI 框架的意图,而不是 Maven 的意图。特别是如果您正在使用策略模式。这绝对是 DI 框架的任务。您必须考虑您的测试策略。如果您需要针对开发、测试或生产的不同策略。 - khmarbaise
3个回答

3
您需要的是一个可以接受系统属性的工厂。如果系统属性未设置,则创建LiveMailTransport实例。如果存在该属性,则创建TestMailTransport实例。建议的属性名称为:com.pany.app.enableTestMails。您可以使用Boolean.getBoolean(String)方法来判断属性是否存在。现在,配置surefire插件以设置该属性,就完成了。

0

那听起来像是滥用了Maven,因为这更像是依赖注入任务(例如guice),但与Maven没有关系。


0

如果您正在使用Spring或其他依赖注入框架,您可以根据相应配置的包含来操作注入的依赖项。

但是,如果您想在纯粹的Java应用程序中执行此操作,您可以创建多个工厂,这些工厂将创建相应的MailTransport实例,并将这些工厂放置在不同的源文件夹中。然后使用build-helper-maven-plugin根据活动配置文件添加相应的源文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接