`
popwang
  • 浏览: 59526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

maven-Profiles

阅读更多
Profiles maven 的一个很关键的术语: profile 是用来定义一些在 build lifecycle 中使用的 environmental variations profile 可以设置成在不同的环境下激活不同的 profile (例如:不同的 OS 激活不同的 profile ,不同的 JVM 激活不同的 profile ,不同的 dabase 激活不同的 profile 等等)。
 
定义 Profiles
 
你可以把 profiles 定义在 4 个地方:
  • %M2_HOME%/conf/settings.xml ,这是针对该部电脑的所有 user profiles ,是 global profiles ,它会影响所有的 maven project build
 
  • <your -home-directory>/.m2/settings.xml ,这是针对 per user profiles ,是 user 级的 profiles ,它会影响当前 user 的所有 maven project build
 
  • 定义在 pom.xml 文件里面,这是仅针对该 project profiles ,是 project 级的 profiles
 
  • profiles.xml ,它和 pom.xml 在同一个目录下,也是 project 级的 profiles ,使用 profiles.xml 的目的是希望把 profiles 的设置从 pom.xml 里抽离出来设置。
 
定义在这 4 个地方的 profiles 中,涉及范围越窄的 profiles 会覆盖范围越宽的 profiles 即:定义在 pom.xml profiles 会覆盖 profiles.xml 的, profiles.xml 的会覆盖 <your -home-directory>/.m2/settings.xml 的, <your -home-directory>/.m2/settings.xml 的会覆盖 %M2_HOME%/conf/settings.xml 的。
 
不过请注意:设置在 pom.xml 里的 profiles 是最最推荐的,因为 pom.xml 会被 deploy repository 里,所以 pom.xml 里的 profiles 才会 available for subsequent builds originating from the repository or as transitive dependencies 。而 settings.xml profiles.xml 里定义的 profiles 不会被 deploy repository ,则有诸多限制,因此,只有下面几个 profiles 能够在 settings.xml profiles.xml 里定义:
  • repositories
  • pluginRepositories
  • properties
 
其他类型的 profiles 必须在 pom.xml 里定义(上面 3 profiles 也可以在 pom.xml 里定义)。
 
Pom.xml 能够定义的 profiles 包括:
  • <repositories>
  • <pluginRepositories>
  • <dependencies>
  • <plugins>
  • <properties> (not actually available in the main POM, but used behind the scenes)
  • <modules>
  • <reporting>
  • <dependencyManagement>
  • <distributionManagement>
  • a subset of the <build> element, which consists of:
    • <defaultGoal>
    • <resources>
    • <testResources>
    • <finalName>
 
激活 Profiles
 
激活 profiles 有下列几种方式:
  • Explicitly
  • Through Maven settings
  • Based on environment variables
  • OS settings
  • Present or missing files
 
1) 通过mvn命令的-P 参数来显示激活 profiles该参数值是 profile id list (之间用逗号连接) 。如:
mvn groupId:artifactId:goal -P profileId-1,profileId-2
 
2)                        通过在 settings.xml 里设置 <activeProfiles> element 来激活(当然 <profiles> 也必须在 settings.xml 里定义)
<settings>
 ...
          <profiles>
 <profile>
    <id>profile1</id>
    ...
 </profile>
          </profiles>
 
 <activeProfiles>
    <activeProfile>profile-1</activeProfile>
 </activeProfiles>
 ...
</settings>
 
            列在<activeProfiles>里的profiles list会在每一个project执行时被激活
 
3) Profiles还可以基于detect到的build environment 的state来自动激活,而不需要象上面2种方式显式激活。这只需要在profile定义时使用<activation> element。如:
<profiles>
 <profile>
    <activation>
      <jdk>1.4</jdk>
    </activation>
    ...
 </profile>
</profiles>
上面的代码表示:如果 JDK version start with 1.4 eg. "1.4.0_08", "1.4.2_07", "1.4" ),该 profile 会被激活
 
<profiles>
 <profile>
    <activation>
      <property>
        <name>debug</name>
      </property>
    </activation>
    ...
 </profile>
</profiles>
上面的代码表示:如果存在system propertie “debug”,该profile会被激活。为了激活它,输入的命令类似于:
mvn groupId:artifactId:goal –Ddebug
 
<profiles>
 <profile>
    <activation>
      <property>
        <name>environment</name>
        <value>test</value>
      </property>
    </activation>
    ...
 </profile>
</profiles>
上面的代码表示:如果存在system propertie “environment”的值为test,该profile会被激活。为了激活它,输入的命令类似于:
mvn groupId:artifactId:goal -Denvironment=test

4) Profiles 还可以基于 OS setting 来自动激活
<profiles>
 <profile>
    <activation>
      <os>
      <name>Windows XP</name>
      <family>Windows</family>
      <arch>x86</arch>
      <version>5.1.2600</version>
    </os>
        </activation>
 ...
 </profile>
</profiles>
            上面的代码表示:如果OS为windows xp,该profile会被激活
 
5) 根据某个 file 不存在而激活 profile 。例如下面定义的profile是在target/generated-sources/axistools/wsdl2java/org/apache/maven 不存在时激活
<profiles>
 <profile>
    <activation>
      <file>
        <missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
      </file>
    </activation>
    ...
 </profile>
</profiles>
 
 
使用 Profiles 时要注意的 2 个问题
 
第一、 external properties
 
不是定义在pom.xml里的properties都称为external properties。举例说明最明了:
pom.xml
<project>
 ...
 <build>
    <plugins>
      <plugin>
        <groupId>org.myco.plugins</groupId>
        <artifactId>spiffy-integrationTest-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <appserverHome>${appserver.home} </appserverHome>
        </configuration>
      </plugin>
      ...
    </plugins>
 </build>
 ...
</project>
 
~/.m2/settings.xml
<settings>
 ...
 <profiles>
    <profile>
      <id>appserverConfig</id>
      <properties>
        <appserver.home>/path/to/appserver</appserver.home>
      </properties>
    </profile>
 </profiles>
 
 <activeProfiles>
    <activeProfile>appserverConfig</activeProfile>
 </activeProfiles>
 ...
</settings>
 
当你执行该 pom 时,运行正常。但如果 another user 执行时,则运行失败,因为无法解析 ${appserver.home} (这是由于该 properties 是定义在 user 级别的 settings.xml )。
 
解决方法 就是把该profile放到pom.xml里定义,但这样做的缺点是所有使用该 profile的pom.xml每个都要定义一次该profile。
 
最好的解决方法 是:Since Maven provides good support for project inheritance, it's possible to stick this sort of configuration in the pluginManagement section of a team-level POM or similar, and simply inherit the paths
 
 
第二、 pom.xml 里定义的 profiles 不符合激活条件
依然是举个例子:
pom.xml
<project>
 ...
 <profiles>
    <profile>
      <id>appserverConfig-dev </id>
      <activation>
        <property>
          <name>env</name>
          <value> dev </value>
        </property>
      </activation>
      <properties>
        <appserver.home>/path/to/dev/appserver</appserver.home>
      </properties>
    </profile>
 
    <profile>
      <id>appserverConfig-dev-2 </id>
      <activation>
        <property>
          <name>env</name>
          <value> dev-2 </value>
        </property>
      </activation>
      <properties>
        <appserver.home>/path/to/dev/appserver2</appserver.home>
      </properties>
    </profile>
 </profiles>
 
 <build>
    <plugins>
      <plugin>
        <groupId>org.myco.plugins</groupId>
        <artifactId>spiffy-integrationTest-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <appserverHome>${appserver.home} </appserverHome>
        </configuration>
      </plugin>
      ...
    </plugins>
 </build>
 ...
</project>
 
上面定义的pom.xml定义了两个profile:不同的”env”参数值会激活不同的profile。当执行命令:
mvn -Denv=dev-2 integration-test
就会激活profile “appserverConfig-dev-2
 
当执行命令:
mvn -Denv=dev integration-test
就会激活profile “appserverConfig-dev
 
而当执行命令:
mvn -Denv=production integration-test
则运行失败,因为没有激活任何一个profile,因此无法解析${appserver.home}。
 
 
查看 build time 过程中使用了哪些 Profiles
执行help pluginactive-profiles goal ,使用命令:
            mvn help:active-profiles
 
例子:
对于上面的例子,如果输入命令:
            mvn help:active-profiles -Denv=dev
则输出的是:
The following profiles are active:
 
 - appserverConfig-dev (source: pom)
 
如果有一个profile定义在settings.xml里并使用<activeProfile>激活,那么输入命令:
            mvn help:active-profiles
则输出的是:
The following profiles are active:
 
 - appserverConfig (source: settings.xml)
 
 
如果输入命令:
            mvn help:active-profiles -P appserverConfig-dev
那么输出的是:
The following profiles are active:
 
 - appserverConfig-dev (source: pom)
 - appserverConfig (source: settings.xml)
分享到:
评论

相关推荐

    apache-maven-3.8.4-bin.zip

    Maven的 profiles** Profiles允许根据不同的环境配置项目。例如,你可以为开发、测试和生产环境创建不同的配置,包含不同的依赖和插件设置。 **9. Maven的聚合与继承** Maven支持项目聚合(aggregation)和继承...

    MAVEN-配置apache-maven-3.5.2.zip

    - Maven的profiles允许根据不同的环境或需求配置不同的构建行为,如开发、测试和生产环境的配置差异。 10. **Maven Archetypes** - Maven Archetypes是预定义的项目模板,可以帮助用户快速创建新项目,只需提供...

    apache-maven-3.6.1-bin

    9. ** profiles**:Maven的profile功能允许根据不同的环境或条件选择不同的构建配置。 10. **命令行接口(CLI)**:用户可以通过命令行工具`mvn`执行Maven的各种操作,如`mvn clean install`来清理项目、编译源码并...

    apache-maven-3.5.0

    7. ** profiles**:Maven的配置可以基于不同的环境(如开发、测试、生产)进行定制,通过profiles实现不同环境下的差异化构建。 8. **版本管理**:Maven支持使用SNAPSHOT版本号,用于跟踪开发中的软件版本。当仓库...

    apache-maven-3.3.9 官方下载.rar

    7. ** Profiles(配置文件)**:Maven 提供了Profiles机制,可以根据不同的环境或条件启用或禁用特定的配置。 8. **聚合和继承**:Maven 允许项目聚合(aggregation)和继承(inheritance),这样可以在多个项目间...

    maven-archetype-3.1.2-source-release.zip

    1. profile:Maven支持多环境配置,通过&lt;profiles&gt;标签定义不同的环境变量和构建行为。 2. settings.xml:个人的Maven配置文件,包括仓库地址、镜像设置、用户属性等,可以覆盖全局配置。 六、总结 maven-...

    apache-maven-3.6.0-src

    4. **使用Maven Profiles**:针对不同环境(如开发、测试、生产)定义不同的配置。 通过深入学习和使用"Maven 3.6.0",开发者可以更好地管理和构建Java项目,实现标准化开发流程,提高团队协作效率。

    apache-maven-3.6.1.zip

    此外,还可以通过`&lt;mirrors&gt;`元素设置镜像以提高下载速度,通过`&lt;profiles&gt;`元素定义不同环境的配置。 Maven使用一种约定优于配置(Convention over Configuration)的原则,这意味着它有一套默认的构建规则。例如...

    apache-maven-3.1.0-alpha-1-bin.tar.gz

    9. **Maven profiles**:Maven配置可以通过profiles来区分不同的环境,如开发、测试和生产环境。根据不同的profile,Maven可以使用不同的配置,例如使用不同的数据库连接或打包方式。 10. **Maven的依赖管理**:...

    maven-db-plugin.1.4

    3. **安全实践**:避免在`pom.xml`中直接写入敏感的数据库连接信息,可以使用Maven的 profiles 或者环境变量来存储。 总之,Maven DB Plugin是Java开发中一个实用的工具,它简化了与数据库交互的构建过程,提高了...

    apache-maven-3.3.3

    - 通过 profiles 功能,可以为不同的环境(如开发、测试、生产)配置不同的属性和依赖。 - 在POM中定义插件配置,可以自定义构建过程。 - 使用Maven Archetypes创建项目模板,快速初始化新项目。 总结来说,...

    apache-maven-3.5.2 资源包以及配置方法

    5. **全局配置**:`settings.xml`还允许你配置全局的Maven属性,如`&lt;profiles&gt;`用于定义不同环境的配置,`&lt;servers&gt;`用于管理认证信息,如部署到私有仓库时所需的用户名和密码。 6. **插件配置**:Maven通过插件...

    apache-maven-3.6.1.rar

    9. ** profiles**:Profile是Maven中的一种条件配置,可以根据不同的环境(如开发、测试、生产)或需求来切换不同的配置。 10. **命令行接口**:Maven提供了命令行界面,用户可以通过简单的命令如`mvn clean ...

    apache-maven-3.5.4-bin.zip

    8. ** profiles**:Maven的profiles允许根据不同的环境或需求配置不同的构建设置,如开发、测试和生产环境的配置。 9. **站点生成**:Maven可以自动生成项目的文档站点,包括项目信息、报告、源码和API文档,这极大...

    apache-maven-3.6.3.zip

    - **Maven profiles**:掌握配置文件中的profile概念,用于在不同环境下调整构建行为。 - **Maven的继承和聚合**:学习如何通过多模块项目结构来组织和管理大型项目。 - **Maven的模型元数据**:分析POM的元数据,...

    apache-maven-3.2.3

    9. **Maven profiles**:允许为不同环境或构建目标定义配置,通过激活profile来改变构建行为。 10. **Maven命令行界面**:提供了丰富的命令行选项,如`mvn clean`用于清理项目,`mvn install`用于安装项目到本地...

    maven-3.3.9

    9. **profiles**:Maven的profiles机制允许根据不同的环境(如开发、测试、生产)切换配置,方便部署。 10. **编码规范与质量检查**:Maven可以通过插件如Checkstyle、PMD等,帮助开发者遵循编码规范,提高代码质量...

    maven-eclipse_plugin.zip

    4. **支持Maven profiles**:可以方便地在Eclipse中切换和激活不同的Maven profile。 5. **支持Maven插件**:允许你在Eclipse中直接运行Maven插件的目标。 6. **WTP集成**:如果你在进行Web项目开发,Maven ...

    apache-maven-3.6.3.rar

    2. 使用Maven Profiles适应不同的构建环境。 3. 定期更新Maven,以获取最新的特性、修复和安全更新。 总的来说,Apache Maven 3.6.3是一个强大且广泛使用的工具,它简化了Java开发的构建流程,提高了开发效率,使得...

Global site tag (gtag.js) - Google Analytics