【问题标题】:Dynamically adding a Maven dependency from a property从属性动态添加 Maven 依赖项
【发布时间】:2013-03-11 14:19:19
【问题描述】:

我正在尝试向我的 POM 添加一个system 范围的依赖项。诀窍是我没有systemPath。相反,我有一个属性文件的路径,其中包含我可以用作路径的属性。

我尝试使用properties-maven-plugin 来处理这个问题,但似乎系统依赖关系在插件运行之前得到了解决,因此我试图定义的属性还不够快。

这是我的 POM 部分:

<profiles>
    <profile>
        <id>dylink</id>
        <dependencies>
            <dependency>
                <artifactId>outside-lib</artifactId>
                <groupId>com.foo</groupId>
                <version>1.0</version>
                <scope>system</scope>
                <systemPath>${outsidelib.location}/outside-lib.jar</systemPath>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>properties-maven-plugin</artifactId>
                    <version>1.0-alpha-2</version>
                    <executions>
                        <execution>
                            <phase>initialize</phase>
                            <goals>
                                <goal>read-project-properties</goal>
                            </goals>
                            <configuration>
                                <files>
                                    <file>C:\path\to\file.properties</file>
                                </files>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

然后我运行mvn -P dylink compile 之类的东西并被告知我的systemPath 无效,因为它不是绝对路径。 (该属性包含绝对路径)

或者,我还有其他方法可以做到这一点吗?我需要能够查询主机系统以获取系统范围依赖项的位置。将路径硬编码到 POM 中是行不通的。

【问题讨论】:

    标签: maven


    【解决方案1】:

    这是不可能的。为了执行插件,maven 需要在本地存储库中“下载”所有需要的东西。它需要确定依赖项的版本,这些版本通常在属性中定义。因此,在下载所有缺失的内容之前,在执行插件之前,它需要首先查找属性值。您希望在定义属性值之前执行插件...

    我猜属性插件在执行时会添加额外的属性值,但这是在 maven 依赖项检查之后发生的......

    【讨论】:

    • 最终,一个“更干净”的解决方案是要求您的依赖项的生产者将其放入他们自己的可公开访问的 maven 存储库中,并将该存储库添加到您的 pom.xml 中。 Maven 将搜索它以查找您的依赖项。 Sonatype.org 提供此类服务...
    【解决方案2】:

    我在这里猜测,但如果您必须动态指定它,那是因为您必须在另一个环境中运行它。您可以做的仍然是使用 maven 属性,但您可以将其作为参数传递到命令行:

    mvn -Doutsidelib.location=myAbsolutePathReadFromPropertyFileJustBefore
    

    当然,在运行 maven 命令之前,您必须读取属性文件或设置环境变量。

    【讨论】:

    • 简化问题的好主意。我试过了,Maven 仍然不喜欢 systemPath 中的变量。我放弃并制作了一个包装脚本,在运行 Maven 之前将系统 jar 安装到本地存储库中,这很有效。不过,我仍然不明白为什么我不能让它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2017-03-24
    • 2011-10-12
    相关资源
    最近更新 更多