在Maven中从POM文件读取属性文件

在Maven中从POM文件读取属性文件,maven,pom.xml,Maven,Pom.xml,为什么这不起作用?如何从属性文件中选择版本号 读取pom.xml中的属性 <project> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <ve

为什么这不起作用?如何从属性文件中选择版本号

读取pom.xml中的属性

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
          </execution>
          <configuration>
            <files>
              <file>dev.properties</file>
            </files>
          </configuration>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj.aspectjrt.version}</version>
        </dependency>

org.codehaus.mojo
属性maven插件
1
初始化
读取项目属性
开发属性
在dev.properties中

org.aspectj.aspectjrt.version=1.6.11

pom.xml中的依赖关系

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
          </execution>
          <configuration>
            <files>
              <file>dev.properties</file>
            </files>
          </configuration>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj.aspectjrt.version}</version>
        </dependency>

org.aspectj
aspectjrt
${org.aspectj.aspectjrt.version}
错误:依赖项必须是生成作业的此
属性(dev.properties)
文件的有效版本

<files>
   <file>dev.properties</file>
</files>

开发属性
对于依赖关系,您需要在pom.xml文件中添加如下内容

<properties>

<org.aspectj.aspectjrt.version>1.6.11</org.aspectj.aspectjrt.version>
</properties>

1.6.11

从命令行启动Maven时,它会经历许多阶段。这里是对这些阶段的伪描述,我有意简化确切的顺序(冒着说一些稍微不正确/不符合顺序的话的风险),这样你就可以明白为什么你试图做的事情不起作用

  • 首先,它解析命令行,使用
    -Dname=value
    在命令行上定义的任何属性都被注入
    MavenSession

  • 将检查reactor定义命令行选项,以确定要构建的项目列表(也称为reactor)
    -N
    表示只构建根
    pom.xml
    -pl
    允许指定要构建的模块列表,
    -am
    -amd
    分别允许从
    -pl
    指定的模块向上游或下游添加模块。Maven此时还没有解析任何
    pom.xml
    文件

  • 分析
    -p
    配置文件激活规则以查看要激活的配置文件

  • 现在Maven有足够的知识开始解析
    pom.xml
    文件。它首先加载并解析根
    pom.xml
    ,即当前目录中的根(或者,如果您使用
    -f
    指定了另一个
    pom.xml
    ,则该根)。最初的解析只是专注于计算要构建的项目列表。配置文件激活仅在可能影响可用的
    列表时考虑。
    pom.xml
    中的组Id、工件Id、版本和打包坐标不能包含属性,因为此时尚未对
    pom.xml
    中的属性进行解析。(细心的读者还将看到,这也解释了为什么您不能基于
    pom.xml
    中的属性激活概要文件,因为在此阶段仅分析了系统属性)

  • 一旦项目集得到验证,Maven现在对那些
    pom.xml
    文件进行更多的解析,以构建构建扩展列表(如果有的话)和插件列表。在这个阶段,解析需要对每个项目中的
    进行评估,因此这是对这些进行评估并“注入”到有效模型中的时候。因此,您可以使用系统属性和pom属性来定义(xpath)
    /project/build/extensions
    /project/build/pluginManagement/plugins/plugins
    /project/build/pluginManagement/plugins/dependencies
    ,中的坐标和其他依赖项,
    /project/build/plugins/plugin
    /project/build/plugins/plugins/dependencies

  • 现在,Maven开始解析命令行上指定的目标和阶段列表。部分指定的目标将根据插件列表进行匹配评估。对于插件目标将针对的所有项目,匹配必须是唯一的(即,如果是聚合器目标,则仅在根目录处需要匹配,但对于所有其他“正常”目标,插件短名称必须与所有项目的插件相同)。生命周期阶段必须来自其中一个默认生命周期,或者来自构建扩展中定义的生命周期

  • 从解析的目标和阶段列表中,Maven构建了构建计划,即它将对哪些项目执行什么操作,以及按照什么顺序执行。为了做到这一点,Maven必须解析reactor projects
    pom.xml
    文件中定义的项目依赖项列表。这是因为反应堆内的另一个项目可能会产生依赖关系,从而迫使项目执行顺序。因此,您可以使用系统属性和pom属性来定义(xpath)
    /project/dependencyManagement/dependencyManagement/dependency/dependency
    /project/dependency/dependency
    中的坐标和其他依赖项,但请注意,此时没有执行插件

  • 既然Maven有了构建计划,它就开始按照构建的顺序遵循该计划。如果CLI上的第一个目标/阶段是目标,则将调用该目标。如果第一个目标/阶段是默认构建生命周期的一个阶段,那么Maven将从
    初始化
    阶段开始,并执行绑定到该阶段的所有插件。。。以类似的方式继续执行阶段列表和项目列表。还要注意,
    初始化
    阶段仅作为默认构建生命周期的一部分执行。它不会在默认清理或默认站点生命周期上执行,也不会在任何自定义生命周期上执行。(细心的读者会得出结论,这突出了问题所尝试的技术的另一个问题)。注意:请记住,聚合器目标在反应器中形成了一个“中断”,因此如果您要求Maven运行
    clean package foo:bar站点
    where
    foo: