首页 > 解决方案 > 如何使用 Maven 从 pom.xml 中的 settings.xml 访问元素?

问题描述

根据https://maven.apache.org/pom.html#properties应该可以用来从 pom.xml 文件中的 settings.xml 文件${settings.x}访问元素。<settings><x>value</x></settings>

但是,当我尝试类似

  <profiles>
    <profile>
      <activation>
        <file>
          <exists>${settings.localRepository}/path/to/file</exists>
        </file>
      </activation>
    </profile>
  </profiles>

在我的 pom.xml 中,它不会在有效的 pom.xml 中被替换。当我用它替换${settings.localRepository}时,${user.home}/.m2/repository它工作正常,但这不是我想要的。我能做些什么来解决这个问题吗?(使用 Apache Maven 3.6.0 测试。)

背景资料: 我有一个在线 Maven 存储库中不存在的依赖项,我无法更改它。它必须由用户编译,并且可以安装到本地存储库。我没有手动执行此操作,而是尝试在我的 pom.xml 中自动执行此操作。为此,如果本地存储库中不存在依赖项,我必须忽略它。因此,检查文件是否存在于本地存储库中的配置文件。如果没有配置文件,maven 甚至不会启动生命周期,因为无法解决依赖关系。当然,第一次执行 pom.xml 时项目不会编译。但是所有依赖项都会自动安装,并且项目将在第二遍中编译。我知道这不是一个干净的解决方案,但我认为它' s 比告诉用户在编译此项目之前手动编译和安装依赖项 xy 更好。我还包括一个首先运行的构建脚本mvn clean initialize安装依赖项,然后mvn clean compile.

标签: mavenpom.xmlmaven-profilesmaven-repository

解决方案


将外部依赖的来源放在自己的项目中,例如:

+- main
   +- pom.xml ... <packaging>pom...<module>external...<module>internal
   |
   +- external
   |  +- ... Maven dirs as usual ...
   |  + pom.xml
   |
   +- internal
      +- ... Maven dirs as usual ...
      +- pom.xml ... <dependency>external

这样在构建mainMaven Reactor时会处理项目的构建顺序(external先构建,然后internal在这种情况下),您可以忘记处理settings.xml、存储库、配置文件或属性。


推荐阅读