My parent pom has this as declaration :

    <parent>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-nar-bundles</artifactId>
        <version>1.11.4</version>
    </parent>

When I studied the maven plugin, I found the following in class
org.apache.nifi.extension.definition.extraction.ExtensionClassLoaderFactory.java
    private String determineProvidedEntityVersion(final Set<Artifact>
artifacts, final String groupId, final String artifactId) throws
ProjectBuildingException, MojoExecutionException {
        getLog().debug("Determining provided entities for " + groupId + ":"
+ artifactId);
        for (final Artifact artifact : artifacts) {
            if (artifact.getGroupId().equals(groupId) &&
artifact.getArtifactId().equals(artifactId)) {
                return artifact.getVersion();
            }
        }
        return findProvidedDependencyVersion(artifacts, groupId,
artifactId);
    }
In this case, it search artifact in the dependencies.

If not found, check from provided dependencies (in fact from artifact that
the current artifact depends on, if I well understood)
And the function is :
    private String findProvidedDependencyVersion(final Set<Artifact>
artifacts, final String groupId, final String artifactId) {
        final ProjectBuildingRequest projectRequest = new
DefaultProjectBuildingRequest();
        projectRequest.setRepositorySession(repoSession);
        projectRequest.setSystemProperties(System.getProperties());
        projectRequest.setLocalRepository(localRepo);
        for (final Artifact artifact : artifacts) {
            final Set<Artifact> artifactDependencies = new HashSet<>();
            try {
                final ProjectBuildingResult projectResult =
projectBuilder.build(artifact, projectRequest);
                gatherArtifacts(projectResult.getProject(),
artifactDependencies);
                getLog().debug("For Artifact " + artifact + ", found the
following dependencies:");
                artifactDependencies.forEach(dep ->
getLog().debug(dep.toString()));

                for (final Artifact dependency : artifactDependencies) {
                    if (dependency.getGroupId().equals(groupId) &&
dependency.getArtifactId().equals(artifactId)) {
                        getLog().debug("Found version of " + groupId + ":"
+ artifactId + " to be " + artifact.getVersion());
                        return artifact.getVersion();
                    }
                }
            } catch (final Exception e) {
                getLog().warn("Unable to construct Maven Project for " +
artifact + " when attempting to determine the expected version of NiFi
API");
                getLog().debug("Unable to construct Maven Project for " +
artifact + " when attempting to determine the expected version of NiFi
API", e);
            }
        }
        return null;
    }

And again if I well understood the code, it search in artifact to match the
one for specific group and artifact ids, for example nifi-api.
But the version returned is not the one from the found artifact, but from
the source artifact.

So that's why I explicitly set dependencies in the artifact pom to solve
temporary the difficulty.

In the PR, I made the following change :
    private String findProvidedDependencyVersion(final Set<Artifact>
artifacts, final String groupId, final String artifactId) {
        final ProjectBuildingRequest projectRequest = new
DefaultProjectBuildingRequest();
        projectRequest.setRepositorySession(repoSession);
        projectRequest.setSystemProperties(System.getProperties());
        projectRequest.setLocalRepository(localRepo);
        for (final Artifact artifact : artifacts) {
            final Set<Artifact> artifactDependencies = new HashSet<>();
            try {
                final ProjectBuildingResult projectResult =
projectBuilder.build(artifact, projectRequest);
                gatherArtifacts(projectResult.getProject(),
artifactDependencies);
                getLog().debug("For Artifact " + artifact + ", found the
following dependencies:");
                artifactDependencies.forEach(dep ->
getLog().debug(dep.toString()));

                for (final Artifact dependency : artifactDependencies) {
                    if (dependency.getGroupId().equals(groupId) &&
dependency.getArtifactId().equals(artifactId)) {
                        getLog().debug("Found version of " + groupId + ":"
+ artifactId + " to be " + dependency.getVersion());
                        return dependency.getVersion();
                    }
                }
            } catch (final Exception e) {
                getLog().warn("Unable to construct Maven Project for " +
artifact + " when attempting to determine the expected version of NiFi
API");
                getLog().debug("Unable to construct Maven Project for " +
artifact + " when attempting to determine the expected version of NiFi
API", e);
            }
        }
        return null;
    }

Do not know if this is the correct fix, I will way the pull request review.

Etienne



Le ven. 19 juin 2020 à 15:19, Bryan Bende <[email protected]> a écrit :

> If you are not using nifi-nar-bundles as your parent (which is fine), then
> you should be explicitly setting versions for nifi-api and
> nifi-framework-api.
>
> Otherwise how would it know to use 1.11.4 ?
>
>
> On Fri, Jun 19, 2020 at 9:09 AM Etienne Jouvin <[email protected]>
> wrote:
>
>> Ok, will try to just post simple thing.
>>
>> The project has the following :
>> <project xmlns="http://maven.apache.org/POM/4.0.0";
>>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
>> https://maven.apache.org/xsd/maven-4.0.0.xsd";>
>>     <modelVersion>4.0.0</modelVersion>
>>     <parent>
>>         <groupId>ch.amexio.nifi.transform</groupId>
>>         <artifactId>nifi-transform-nar-bundles</artifactId>
>>         <version>0.0.1-SNAPSHOT</version>
>>     </parent>
>>
>>     <artifactId>nifi-transform-service-api</artifactId>
>>     <packaging>jar</packaging>
>>
>>     <dependencies>
>>         <!-- NiFi dependencies. -->
>>         <dependency>
>>             <groupId>org.apache.nifi</groupId>
>>             <artifactId>nifi-api</artifactId>
>>         </dependency>
>>     </dependencies>
>> </project>
>>
>> the nar project ::
>>
>> <project xmlns="http://maven.apache.org/POM/4.0.0";
>>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
>> https://maven.apache.org/xsd/maven-4.0.0.xsd";>
>>     <modelVersion>4.0.0</modelVersion>
>>     <parent>
>>         <groupId>ch.amexio.nifi.transform</groupId>
>>         <artifactId>nifi-transform-nar-bundles</artifactId>
>>         <version>0.0.1-SNAPSHOT</version>
>>     </parent>
>>
>>     <artifactId>nifi-transform-service-api-nar</artifactId>
>>     <packaging>nar</packaging>
>>
>>     <properties>
>>         <maven.javadoc.skip>true</maven.javadoc.skip>
>>         <source.skip>true</source.skip>
>>     </properties>
>>
>>     <dependencies>
>>         <!-- Project dependencies. -->
>>         <dependency>
>>             <groupId>ch.amexio.nifi.transform</groupId>
>>             <artifactId>nifi-transform-service-api</artifactId>
>>             <version>0.0.1-SNAPSHOT</version>
>>             <scope>compile</scope>
>>         </dependency>
>>
>>         <!-- NiFi dependencies. -->
>>         <dependency>
>>             <groupId>org.apache.nifi</groupId>
>>             <artifactId>nifi-standard-services-api-nar</artifactId>
>>             <type>nar</type>
>>         </dependency>
>>     </dependencies>
>> </project>
>>
>> It was then in failure.
>> What I did, is to change the my parent pom and add the following in
>> dependencies
>>     <dependencies>
>>         <!-- NiFi dependencies. -->
>>         <!-- Required for NAR generation. -->
>>         <dependency>
>>             <groupId>org.apache.nifi</groupId>
>>             <artifactId>nifi-api</artifactId>
>>         </dependency>
>>         <dependency>
>>             <groupId>org.apache.nifi</groupId>
>>             <artifactId>nifi-framework-api</artifactId>
>>         </dependency>
>>     </dependencies>
>>
>>
>> By the way, I submit a Pull Request on nifi-maven
>> https://github.com/apache/nifi-maven/pull/13
>> With following change :
>> https://github.com/apache/nifi-maven/pull/13/files
>>
>> Etienne
>>
>>
>>
>> Le ven. 19 juin 2020 à 13:52, Mike Thomsen <[email protected]> a
>> écrit :
>>
>>> Without seeing your POM(s), it could be several things. Try posting your
>>> POMs here or as a GitHub gist.
>>>
>>> On Fri, Jun 19, 2020 at 3:36 AM Etienne Jouvin <[email protected]>
>>> wrote:
>>>
>>>> Hello all.
>>>>
>>>> Do not know where to post the message, guide me if I should send to
>>>> another mailing list.
>>>> A simple summary in first step.
>>>> I created a simple project to build a new service.
>>>> I extend the nifi-nar-bundles artifact with version 1.11.4.
>>>> My project version is currently 0.0.1-SNAPSHOT.
>>>>
>>>> During NAR generation, it failed for the documentation with message :
>>>> org.apache.maven.plugin.MojoExecutionException: Failed to create
>>>> Extension Documentation
>>>> Caused by: org.apache.maven.plugin.MojoExecutionException: Could not
>>>> resolve local dependency org.apache.nifi:nifi-api:jar:0.0.1-SNAPSHOT
>>>>
>>>> I am currently looking in source code of nifi-maven project, specially
>>>> class ExtensionClassLoaderFactory.
>>>>
>>>> What I do not understand is why it searches for version 0.0.1-SNAPSHOT
>>>> on nifi-api, and not the version 1.11.4
>>>>
>>>> Let me know if I should discuss about this in another thread.
>>>>
>>>> Regards
>>>>
>>>> Etienne
>>>>
>>>

Reply via email to