36

很多java应用程序都是用maven构建的。maven 有 Profiles 的概念,为不同的环境构建发布包真的很方便。例如dev/test/prod使用不同的path / jndiname / security rule / properties files......我想我不必在这里列出代码来解释它。

Spring 是一个非常好的和流行的 java 开发框架,从 spring3 开始它也支持配置文件概念。

现在问题来了,对于发布到不同的 ENV 目的,哪个更好?现在我更喜欢 Maven 配置文件。因为 spring 必须复制每个配置文件中的每个 bean 定义。它需要一个初始化程序/属性来让 spring 知道应该激活哪个配置文件。

但我觉得spring profile比maven profile更灵活。

你怎么看?请给一些建议。谢谢你。

4

5 回答 5

41

Maven 配置文件将提供构建时解决方案,而 SpringFramework 配置文件将提供运行时替代方案。我想这是大家可能会问自己的第一个问题:他是想拥有一个可以部署在不同环境中的单个包,还是希望构建工具根据目标环境提供不同的包。

要记住的一件事是,如果您将不同的软件包部署到不同的服务器中,可能会出现许多问题。例如,在我的工作场所,如果我正在部署一个包来纠正以前在生产环境中发生的错误,公司政策会规定唯一可接受的情况是我在 QA 和生产服务器中拥有相同的解决方案包。

于 2012-08-08T16:51:47.543 回答
7

如果您需要不同的工件,请使用 Maven。如果它只是一个可以在构建工件之后配置的真实配置,那么用户 Spring 配置文件。

于 2012-08-08T16:47:06.710 回答
6

正如其他回复中提到的:这完全取决于你的工作方式:)

我们在过去几年使用 maven 和现在的 spring 3.1 配置文件想出的是这样的:

  • 我们使用 maven-release-plugin 来削减版本。如果我们使用 Maven 配置文件,这会导致环境问题,因为我们需要重建版本或至少每个 Maven 配置文件的标签
  • 因此我们为所有环境创建 .war 文件并使用 springPropertyPlaceholderConfigurer来设置应用程序(或某些 JNDI 资源,具体取决于客户)。这允许只运行一个 Maven 版本。
  • 当环境不同时,弹簧型材也会出现。例如,并非在所有环境中都可用的身份验证服务。在这里,我们存根该服务并将其放入弹簧配置文件中。我们在我们使用的属性中激活了弹簧轮廓PropertyPlaceholderConfigurer

有一些关于如何做到这一点的不错的教程:

我们通常只使用 maven 配置文件将构建分成不同的部分,供开发人员和持续集成构建使用。对于 .war 文件,我们实际上不再将它们用于目标环境。我们仍然使用 maven 配置文件进行自动化数据库部署,与 Web 应用程序(数据量、测试数据等)相比,这些配置文件的差异更大,但这些配置文件不是以 zip 格式交付的。

肯定还有其他的路要走。我不认为这是故事的结局:)

但这可能会有所帮助。

于 2012-08-08T17:07:44.323 回答
2

我碰巧使用 properties-maven-plugin 来设置系统属性,具体取决于激活的 maven 配置文件。然后在 Spring 中,我以编程方式激活了我想要的配置文件,具体取决于该系统属性:

字符串 activeProfile = System.getProperty("myapp.profile");

appContext.getEnvironment().setActiveProfiles(....)

此外,当我想直接链接两种配置文件(maven/spring)时,我是通过 maven 插件设置 spring.profiles.active 属性。

这些做法在设计中可能是错误的,但它们解决了我的问题。

于 2014-11-26T02:19:15.297 回答
0

我认为这取决于您的要求。如果您有基于环境的不同依赖项(即 jdbc 驱动程序等),您将需要使用 maven 来解决这个问题。

如果只是配置部署的问题,那么使用 spring 可能会更好。

于 2012-08-08T16:48:07.217 回答