从属性动态添加Maven依赖项

时间:2013-03-21 21:15:21

标签: maven

我正在尝试向我的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中是行不通的。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

mvn -Doutsidelib.location=myAbsolutePathReadFromPropertyFileJustBefore

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