无法覆盖第三方lib -NiFi

时间:2017-10-27 05:43:45

标签: java maven lucene apache-nifi

我一直致力于创建自定义NIFI处理器。我正在尝试使用Luwak搜索库,它使用Lucene 6.5.0。但是,NiFi库,似乎使用Lucene 4.10.4。我用pom文件尝试了各种各样的东西,但是当我构建nar文件时,它无法覆盖NiFi 4.10.4 lib。这很可能是用户错误。我不能为我的生活弄清楚它是什么。在我的IDE中运行正常,但是当我构建工件(NAR)时,我可以看到4.10.4库是存在的,但不是Luwak需要的6.5.0。任何帮助将不胜感激。

阅读一项研究表明,如果我特意将Lucene版本放在我需要的库中,并使用DependencyMangement它可以工作。还尝试了排除(也显示)。

已编辑:尝试了@Rob建议并删除了pom 进口。但是,仍然有同样的问题。更新了Pom示例

Maven依赖树:

    [INFO] gov.pnnl.nifi:nifi-streamqry-nar:nar:1.3
[INFO] \- gov.pnnl.nifi:nifi-streamqry-processors:jar:1.3:compile
[INFO]    \- com.github.flaxsearch:luwak:jar:1.5.0:compile
[INFO]       +- org.apache.lucene:lucene-core:jar:4.10.4:compile (version managed from 6.5.0)
[INFO]       +- org.apache.lucene:lucene-memory:jar:6.5.0:compile
[INFO]       |  \- (org.apache.lucene:lucene-core:jar:4.10.4:compile - version managed from 6.5.0; omitted for duplicate)
[INFO]       +- org.apache.lucene:lucene-analyzers-common:jar:4.10.4:compile (version managed from 6.5.0)
[INFO]       |  \- (org.apache.lucene:lucene-core:jar:4.10.4:compile - version managed from 6.5.0; omitted for duplicate)
[INFO]       +- org.apache.lucene:lucene-queries:jar:6.5.0:compile
[INFO]       |  \- (org.apache.lucene:lucene-core:jar:4.10.4:compile - version managed from 6.5.0; omitted for duplicate)
[INFO]       \- org.apache.lucene:lucene-queryparser:jar:4.10.4:compile (version managed from 6.5.0)
[INFO]          \- (org.apache.lucene:lucene-core:jar:4.10.4:compile - version managed from 6.5.0; omitted for duplicate)

POM文件

<properties>
    <lucene.group>org.apache.lucene</lucene.group>
    <lucene.version>6.5.0</lucene.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>${lucene.group}</groupId>
            <artifactId>lucene-core</artifactId>
            <version>6.5.0</version>
        </dependency>
        <dependency>
            <groupId>${lucene.group}</groupId>
            <artifactId>lucene-memory</artifactId>
            <version>${lucene.version}</version>
        </dependency>
        <dependency>
            <groupId>${lucene.group}</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>${lucene.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queries -->

        <dependency>
            <groupId>${lucene.group}</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>${lucene.version}</version>
        </dependency>
        <dependency>
            <groupId>${lucene.group}</groupId>
            <artifactId>lucene-queries</artifactId>
            <version>${lucene.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-api</artifactId>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-utils</artifactId>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-mock</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-sandbox</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

排除:

<dependencies>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-api</artifactId>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-utils</artifactId>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-mock</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-queryparser</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
            </exclusion>
            <exclusion>
                <groupId>${lucene.group}</groupId>
                <artifactId>lucene-sandbox</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>

2 个答案:

答案 0 :(得分:3)

4.x lucene版本不会通过传递依赖进入,所以将它们排除在像nifi-api和nifi-mock这样的东西之外也不会做任何事情。

你获得4.x版本的原因是因为你的NAR捆绑根pom很可能有一个nifi-nar-bundle的父亲,这意味着你一直继承到NiFi的根pom,这导致了NiFi的依赖管理在您的NAR中生效。

你有两个选择......

1)如果这是一个将在NiFi源树之外生活的自定义捆绑包,那么您可以删除捆绑包和NiFi之间的这种关系。这在这里描述:

https://cwiki.apache.org/confluence/display/NIFI/Maven+Projects+for+Extensions#MavenProjectsforExtensions-Inheritance

最新的NAR插件是1.2.0。

2)如果你打算将这个贡献给NiFi,或者如果你正在维护自己的NiFi分支并希望你的捆绑在nifi / nifi-nar-bundle下生活,那么你应该能够做到这一点通过在捆绑包的根pom中声明自己的dependencyManagement部分,并声明与顶级NiFi pom相同的lucene依赖关系,并将其版本设置为6.5.0。

在NiFi中已经有类似情况的一些例子..

例如,NiFi的顶级pom声明了特定版本的http-client,Solr处理器需要不同的版本,因此在此处重新声明:

https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-solr-bundle/pom.xml#L43-L45

第二个选项的重要部分是您的dependencyManagement部分必须位于处理器和NAR上方的bundle的pom中。

答案 1 :(得分:2)

您的问题是由

引起的
amzn-main                                                | 2.1 kB     00:00     
amzn-updates                                             | 2.5 kB     00:00     
Resolving Dependencies
--> Running transaction check
---> Package php-pdo.x86_64 0:5.3.29-1.8.amzn1 will be installed
--> Processing Dependency: php-common(x86-64) = 5.3.29-1.8.amzn1 for package: php-pdo-5.3.29-1.8.amzn1.x86_64
--> Running transaction check
---> Package php-common.x86_64 0:5.3.29-1.8.amzn1 will be installed
--> Processing Conflict: php70-common-7.0.21-1.24.amzn1.x86_64 conflicts php-common < 5.5.22-1.98

来自Maven documentation

  

导入(仅在Maven 2.0.9或更高版本中可用)此范围仅适用   支持pom类型的依赖关系   部分。它表示要用有效替换的依赖关系   指定POM中的依赖项列表   部分。由于它们被替换,因此具有导入范围的依赖项   实际上并没有参与限制a的传递性   依赖性。

你几乎肯定想要使用jar工件。如果你只是删除和标签,它可能会按你的意愿工作。

通过明确提及具有特定版本的组/工件,maven将优先于那些通过传递依赖项包含的版本。只要组/工件名称没有改变,那么这种方法效果很好。

但是,如果组/工件名称已更改,则需要在标记中排除引入过时工件的依赖关系。