如何让Maven解决由非默认概要文件为某些分类程序创建的依赖项的依赖项?

2020-02-14 java maven

给定一个根据配置文件具有不同依赖关系的库,例如

    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <envClassifier>cuda-10.1</envClassifier>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.jcuda</groupId>
                <artifactId>jcuda</artifactId>
                <version>10.1.0</version>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>cuda-10.0</id>
        <properties>
            <envClassifier>cuda-10.0</envClassifier>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.jcuda</groupId>
                <artifactId>jcuda</artifactId>
                <version>10.0.0</version>
            </dependency>
        </dependencies>
    </profile>

例如,我正在使用不同的分类器创建人工制品

library-1.0.0-cuda-10.0

library-1.0.0-cuda-10.1

(此处cuda-10.0cuda-10.1cuda-10.1 library-1.0.0的分类器)。

如果另一个项目引用了这个库,例如说

    <dependency>
        <groupId>net.finmath</groupId>
        <artifactId>library</artifactId>
        <version>1.0.0</version>
        <classifier>cuda-10.0</classifier>
    </dependency>

然后提取正确的伪像(此处为library-1.0.0-cuda-10.0.jar),但依赖项树(通过mvndependency mvn dependency:tree )显示了错误的依赖项依赖项 。在此示例中,它显示的是jcuda-10.1.0,而不是juda-10.0.0。

此问题归因于人工制品对所有分类器都具有单个pom.xml(并且默认配置文件已加入)。

问题1:您是否可以在存储库中为不同的分类器提供专用的pom.xml,以反映正确的依赖关系?

显然,无法通过在外部项目上设置配置文件( -P参数)来解决此问题,因为配置文件选择器未传递到依赖项的pom 。似乎配置文件没有沿着依赖关系树走下去。

问题2:有没有办法将配置文件选择器传递给依赖项的pom来选择正确的依赖项

我找到了两种方法来解决此问题,但是我对它们并不满意。

  1. 第一个是没有默认配置文件,该配置文件在库的pom中具有依赖性。在这种情况下,库的用户(此处为library-1.0.0)必须指定正确的分类器和正确的下游依赖项。这似乎很麻烦。还要注意,在这种情况下,如果不指定概要文件,则库的构建将失败。

  2. 可以使用配置文件更改人工制品的名称(或版本)。由于每个版本或人工制品都带有自己的pom,因此可以指定要解决的特定于配置文件的依赖性。

但是,我认为应该有一个更好的解决方案,因为在其他情况下,似乎对于概要文件中的依赖项的说明对于库(即本身是另一个项目的依赖项)的工件似乎没有任何意义。

问题3: Maven解决此问题的方法是什么?

PS:这个项目出现了一个问题: http : //finmath.net/finmath-lib-cuda-extensions/

Answers

我找到了解决该问题的轻量级解决方案。

  1. 您可以通过属性激活配置文件。

  2. 属性可能不会从pom传递到其依赖项的pom ,但是在命令行上设置的属性对这两个pom都起作用。

  3. 因此,不要在命令行上使用配置文件,而应使用属性并在项目的pom和库的pom中激活相应的配置文件。

因此,在上面的示例中,(外部)项目(引用库)具有一个配置文件

    <profile>
        <id>cudaversion</id>
        <activation>
            <property>
                <name>cuda.version</name>
            </property>
        </activation>
        <properties>
            <finmath-cuda.classifier>cuda-${cuda.version}</finmath-cuda.classifier>
        </properties>
    </profile>

设置其依赖项的分类器,即该项目对library-1.0.0的依赖library-1.0.0

    <dependency>
        <groupId>net.finmath</groupId>
        <artifactId>library</artifactId>
        <version>1.0.0</version>
        <classifier>${finmath-cuda.classifier}</classifier>
    </dependency>

并且library-1.0.0的pom具有一个配置文件,该配置文件

    <profile>
        <id>cuda-10.0</id>
        <activation>
            <property>
                <name>cuda.version</name>
                <value>10.0</value>
            </property>
        </activation>
        <properties>
            <envClassifier>cuda-10.0</envClassifier>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.jcuda</groupId>
                <artifactId>jcuda</artifactId>
                <version>10.0.0</version>
            </dependency>
        </dependencies>
    </profile>

然后使用mvn -Dcuda.version=10.0构建外部项目以激活两个配置文件。

Related