如何使用 Maven 从 pom.xml 中的 settings.xml 访问元素?

Posted

技术标签:

【中文标题】如何使用 Maven 从 pom.xml 中的 settings.xml 访问元素?【英文标题】:How to access elements from settings.xml in pom.xml with Maven? 【发布时间】:2021-12-15 05:01:59 【问题描述】:

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

但是,当我尝试类似的东西时

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

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

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

【问题讨论】:

你能解释一下为什么你喜欢在你的 pom 文件中做这些事情吗? @khmarbaise 完成。 听起来需要一个存储库管理器...或一个提供所需的由适当凭据保护的外部管理器... 【参考方案1】:

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

+- 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

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

【讨论】:

谢谢,我会接受这个答案,因为它可能是我实际问题的解决方案。但是,我仍然想知道为什么我无法从 settings.yml 访问元素,尽管它已记录在案。 @stonar96 这不仅仅是一个“可能的”解决方案。这是典型的 Maven 解决方案。 :) 其他的一切都是针对 Maven 而不是与它一起工作。

以上是关于如何使用 Maven 从 pom.xml 中的 settings.xml 访问元素?的主要内容,如果未能解决你的问题,请参考以下文章

从代码中的 maven pom.xml 检索版本

有没有办法从 text.file 读取文本并将其设置为 pom.xml maven 中的 maven 属性?

Gradle build.gradle 到 Maven pom.xml

如何抑制从父 pom.xml 运行 maven-javadoc-plugin?

从Maven pom.xml更新sonar-project.properties文件中的特定属性?

如何导出项目pom中引用的mavenjar包