我假设您希望能够在开发时测试本地,针对暂存环境进行更改并最终部署到生产环境。
需要牢记的关键是,当工件部署到本地/远程存储库时,活动配置文件不是部署的部分,因此当通过配置文件添加依赖关系时,事情变得非常危险因为您无法知道该Web应用程序是否是在DEV配置文件处于活动状态或PROD配置文件处于活动状态的情况下构建的,然后当将构建的工件部署到生产环境中时,您可能会被严格控制。
所以缺点是你确保你的工件独立于部署环境。
这意味着,例如,你会捡起配置:
因此,举例来说,如果部署到Tomcat,你可能会把一个configuration.properties放入$CATALINA_HOME/lib
启动时的web应用程序将使用getClass().getResource('/configuration.properties')
来解析属性文件,如果文件丢失(故障快速),则无法启动
您可以通过将测试版本放入您的设备/集成测试中来使用其他配置configuration.properties中的src/test/resources
。
对应用程序的<scope>provided</scope>
样式依赖关系使用相同的原则。换句话说,集装箱与提供合同的依赖关系应该由集装箱提供。因此,您可以使用Maven为自己构建生产版本的tomcat/jetty,并将所需的依赖项添加到该程序集中。这将是生产版本使用MySQL数据库的情况,所以您需要将mysql-jdbc驱动程序添加到$CATALINA_HOME/lib
。使用程序集插件执行此操作相对容易,因为您实际上只是重新包装了一些包含某些位的zip文件,而另一些则排除了该zip文件。
当您在本地进行测试时,您会希望使用帮助插件'run
的目标,如jetty:run
和tomcat:run
。这里的解决方案是,通过配置文件提供这些插件依赖关系没有任何问题,因为您不会影响工件的依赖关系,因此您只影响插件的类路径。
例如
<project>
<!-- ... some stuff .. -->
<profiles>
<profile>
<id>DEV</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
您还可以配置系统属性或类路径添加以提取所需的配置文件。
所有这一切的最终结果是神器保持环境独立,可以针对不同的环境中轻松地测试
希望这回答了你的问题(即使横向)的轮廓
添加依赖关系是**主要反模式**并且不应该在原始POM格式规范中被允许。 – 2012-08-14 08:15:49
如何在不同配置文件中需要不同配置的情况下采取行动?我需要排除某些配置文件中的某些依赖关系 – maks 2012-08-14 08:30:24
使用不同的模块和webapp叠加层将模块通过配置文件添加到反应器中。 IOW您将拥有三个或四个webapp模块,除了基本webapp和您需要的附加依赖关系之外,其余所有模块都将为'空' – 2012-08-14 08:36:45