maven tycho 加载 p2 repo 位置的属性文件

maven tycho load properties file for p2 repo locations

我想要一个外部属性文件,其中包含构建中使用的本地 p2 镜像的位置,例如:

mirror.location=/my/mirror/location

我希望这是一个外部文件,因为我想在 Maven 和其他脚本中使用它,并且我想避免在不同语言中重复该位置。

我发现我应该使用 properties-maven-plugin 来做到这一点

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>${tycho.version}</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>read-project-properties</goal>
            </goals>
            <configuration>
                <files>
                    <file>locations.properties</file>
                </files>
            </configuration>
        </execution>
    </executions>
</plugin>

然后我想在同一个 pom 文件url 中使用存储库 属性 中的读取

<repositories>
    <repository>
        <id>eclipse_mirror</id>
        <url>${mirror.location}/eclipse/</url>
        <layout>p2</layout>
    </repository>
</repositories>

问题是 Maven/Tycho 在生命周期的任何阶段之前加载存储库并打印出此错误

[INFO] Computing target platform for MavenProject: ... [ERROR] Internal error: java.lang.RuntimeException: Invalid repository URL: ${mirror.location}/eclipse/: no protocol: ${mirror.location}/eclipse/ -> [Help 1] org.apache.maven.InternalErrorException: Internal error: java.lang.RuntimeException: Invalid repository URL: ${mirror.location}/eclipse/

关于如何使用属性文件指定存储库 urls 的任何线索?

The problem is that Maven/Tycho loads the repositories well before any phase in the lifecycle and prints out this error

这个观察是正确的。只要 Bug 353889 不固定,就不能使用 properties-maven-plugin 来操作 Tycho 在依赖项解析期间需要其值的属性。

话虽这么说,你知道你可以在 Maven 的 setting.xmldeclare mirrors 吗?恕我直言,这是一个更好的地方来声明像镜像这样的设置,因为你可以确保你的主构建构建(如 pom.xml 中指定的)是独立的,即不需要像系统属性这样的外部知识。

最后,请注意,您可以在 settings.xml 中引用 ${env.HOME} 等环境变量。如果您将变量放在一个文件中并让 shell 在 mvn 调用之前获取它,您也可以在其他地方重新使用该文件(尽管它不是 100% .properties文件格式)。