【问题标题】:Migrate Maven 2 profiles.xml to Maven 3将 Maven 2 profiles.xml 迁移到 Maven 3
【发布时间】:2014-12-10 05:08:52
【问题描述】:

我正在尝试将现有的大型多模块项目从 Maven 2 迁移到 Maven 3。该项目大量使用 profile.xml 来定义不同环境(开发、登台、生产)的设置;如您所知,profiles.xml 在 Maven 3 中不再存在。

我的目的是使这种过渡尽可能无缝,因此不能选择在每台机器上使用 settings.xml,也不能要求每个人都使用 -s 和新的设置文件运行 maven。

父 pom 已经相当广泛了,因为它为所有模块配置插件、存储库和依赖项;它还使用操作系统激活的一些配置文件来设置依赖于平台的依赖项的适当分类器。因此,我宁愿不要将所有环境的所有配置选项都放在 pom 本身上,以免造成混乱。

我正在寻找一种将环境配置与 pom 分开的方法;但对所有模块(现在或将来)都是通用的。理想情况下,这意味着该解决方案只需要编辑父 pom,而不是子模块的,从而使这个问题对所有未来的子模块透明。

我查看了properties-maven-plugin,但似乎无法让它为所有子模块加载相同的文件,它会在子模块本身中查找文件,或者如果我使用@987654322 定义相对路径@ 父项目会失败(因为我不能在超级 pom 中为子项目定义构建插件,也不能在父项目上执行)。

我还研究过为每个环境设置单独的属性文件并在父 pom 中设置过滤器,但我遇到了同样的问题。

到目前为止,我唯一能做的就是编辑所有子模块的 pom 并手动将过滤器设置为${project.basedir}/../config/${env}.property;但这肯定不符合对未来模块透明的标准,我发现必须在每个子模块上设置它是非常重复的......

任何想法都非常受欢迎,在此先感谢。

【问题讨论】:

  • 你只是想共享属性,还是插件配置?
  • 现在我们的父 pom 配置插件和依赖项;而我们的配置文件具有用于过滤资源的环境设置(连接字符串等)。我想保持所有子模块共享,但在单独的文件中。
  • 听起来子模块更新它们正在使用的父 POM 的版本是可以接受的,是吗?
  • 我不确定您的建议是什么,但请随时提交您的想法,我们将不胜感激。

标签: maven build maven-3 build-process


【解决方案1】:

您可以尝试使用 Wagon 从网络上的某个位置加载配置,然后使用 properties-maven-plugin 读取:

<build>
    <extensions>
        <extension>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-ssh</artifactId>
            <version>${org.apache.maven.wagon.version}</version>
        </extension>

        <!-- Needed by wagon-maven-plugin, see http://jira.codehaus.org/browse/MOJO-1821 -->
        <extension>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-http</artifactId>
            <version>${org.apache.maven.wagon.version}</version>
        </extension>
    </extensions>
 .....
 <properties>
     <org.apache.maven.wagon.version>2.8</org.apache.maven.wagon.version>
     <shared.config.location>${project.build.directory}/external-config</shared.config.location>
 </properties>
 ....
 <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>wagon-maven-plugin</artifactId>
   <executions>
     <execution>
       <id>retrieve-config</id>
       <phase>initialize</phase>
       <goals>
         <goal>download</goal>
       </goals>
       <configuration>
         <!-- Does nothing if file not found -->
         <url>http://host.company.com/config/environments</url>
         <toDir>${shared.config.location}/environments</toDir>
         <!-- might need <includes> here too?? -->
       </configuration>
     </execution>
   </executions>
 </plugin>

或者,如果您不想使用 Wagon,可以尝试maven-remote-resources-plugin。将属性文件打包到单独的 jar 中,然后将它们加载到this answer 中定义的定义位置。如果您想立即对所有人进行属性更改,而无需他们更新父 POM 版本,那么 Wagon 方法会更好。

无论哪种情况,一旦资源位于项目的目标目录中,您就可以使用properties-maven-plugin 来加载它们。您可以将此配置的 Wagon 或远程资源样式放在新的父 POM 中。

 <!-- Load the properties into the current maven build for use in property 
      replacements. Only impacts plugins running after this one -->
 <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>properties-maven-plugin</artifactId>
   <executions>
     <execution>
       <id>load-props</id>
       <phase>generate-sources</phase>
       <goals>
         <goal>read-project-properties</goal>
       </goals>
       <configuration>
         <files>
           <file>${shared.config.location}/environments/${your.target.env}.properties</file>
         </files>
         <quiet>true</quiet>
       </configuration>
     </execution>
  </executions>
</plugin>

缺点是每个现有模块都必须更新才能使用新版本的父 POM 来获得新功能。不过,这个缺点也有一些好处 - 您可以在时间表允许的情况下逐个项目转换为 Maven 3 项目,并且您将能够进行快速 SCM 搜索以找出哪些项目没有更新,只需注意哪些项目正在使用旧的父 POM。

【讨论】:

  • 感谢您的建议!尽管必须将配置存储在完全不同的位置而不是相同的多模块项目和存储库,但我有点担心;这有点打破了我尽可能保留一切的意图......
  • 如果您使用远程资源方法,环境配置属性可以只是现有多模块构建中的另一个模块。我们使用 Wagon 方法在全球范围内提供配置——我们组织中的许多多模块项目。远程资源版本也很好用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2015-09-21
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2012-05-11
  • 2011-04-29
相关资源
最近更新 更多