Search code examples
javaeclipsemavenm2eclipseparent-pom

Cannot create custom BOM. Project build fails with Non-resolvable import POM: Could not find artifact


I am using eclipse mars with embedded maven (version 3.3.9) and i am facing a problem i cannot understand in order to resolve it. I have been trying to create a JMS related "library" that some other projects can use in their pom under their dependencyManagement section (in other words following the "BOM" pattern). However, when the created BOM is pulled in the dependencyManagement section of the corresponding project that is supposed to use it, the dependencies specified are pulled in, but the project build itself (mvn clean install) fails with an error shown further down.

The structure i used is the following:

A "jms-dependencies-BOM" project (packaged as pom), which includes as a submodule a "jms-dependencies-parent" project (again packaged as pom) which in turn inherits from the "jms-dependencies-BOM" project. Additionally, there is a "amqdeps" submodule of the aforementioned "jms-dependencies-parent" project (packaged as a jar). The "amqdeps" submodule also inherits from the "jms-dependencies-parent" project. The corresponding project that is supposed to import the "jms-dependencies-BOM" pom in its dependencyManagement section and use the "amqdeps" dependency in the dependencies section is "TestIntegrator".

Although it does sound like a duplicate i am not sure it is. My error message is a bit different (no mention of an incorrect relative path for example as in other questions).Now i have tried everything i could think of, purging the whole .m2/repository folder, tried to build the TestIntegrator project from the cli using even a slightly different maven version (3.2) than the embedded one in eclipse. Basically i have tried everything suggested by similar questions asked,all to the same result. I suppose it is something with the way i have structured the BOM hierarchy of the projects (the relative paths perhaps, although the compiler does not complain about it) but i do not understand it enough.

"jms-dependencies-BOM" pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>jms-dependencies-BOM</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
    <amqdeps.version>0.0.1-SNAPSHOT</amqdeps.version>
  </properties>

  <dependencyManagement>
    <dependencies>

        <dependency>
            <groupId>com.test</groupId>
            <artifactId>amqdeps</artifactId>
            <version>${amqdeps.version}</version>
        </dependency>

    </dependencies>  
  </dependencyManagement>

  <modules>
    <module>jms-dependencies-parent</module>
  </modules>
</project>

The "jms-dependencies-parent" pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>jms-dependencies-BOM</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <groupId>com.test</groupId>
  <artifactId>jms-dependencies-parent</artifactId>
  <packaging>pom</packaging>

  <properties>
    <activemq.version>5.13.1</activemq.version>
  </properties>

  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-openwire-legacy</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-camel</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-jaas</artifactId>
            <version>${activemq.version}</version>
        </dependency>

        <--MORE DEPENDENCIES TRUNCATED FOR CLARITY-->

    </dependencies>
  </dependencyManagement>

  <modules>
    <module>amqdeps</module>
  </modules>
</project>

The "amqdeps" pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.test</groupId>
    <artifactId>jms-dependencies-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>amqdeps</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-openwire-legacy</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-camel</artifactId>
    </dependency>

    <--MORE DEPENDENCIES TRUNCATED FOR CLARITY-->

  </dependencies>

  <build>
   <plugins>    
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>

        <plugin>
             <artifactId>maven-install-plugin</artifactId>
             <version>2.5.2</version>
        </plugin>       
    </plugins>
 </build>
</project>

and finally the "TestIntegrator" pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>TestIntegrator</artifactId>
  <version>0.0.1-SNAPSHOT</version>

 <properties>
    <spring.framework.version>5.1.4.RELEASE</spring.framework.version>
    <jms-dependencies-BOM.version>0.0.1.SNAPSHOT</jms-dependencies-BOM.version>
</properties>

<dependencyManagement>  
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>${spring.framework.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.test</groupId>
            <artifactId>jms-dependencies-BOM</artifactId>
            <version>${jms-dependencies-BOM.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

    </dependencies>
</dependencyManagement>

 <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>     
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-websocket</artifactId>
    </dependency>

    <dependency>
        <groupId>com.test</groupId>
        <artifactId>amqdeps</artifactId>        
    </dependency>

</dependencies>

 <build>
   <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

    <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>

        <plugin>
             <artifactId>maven-install-plugin</artifactId>
             <version>2.5.2</version>
        </plugin>

    </plugins>
 </build>
</project>

When i do a mvn clean install in the parent project (i.e. "jms-dependencies-BOM") everything is build and i can see the corresponding poms for the "jms-dependencies-BOM", "jms-dependencies-parent" and "amqdeps" (and the jar for the amqdeps project as well) being installed in the corresponding .m2/repository folder under directories of com/test/... . In addition i can see the dependencies listed in the amqdeps project being pulled in the TestIntegrator project, with no errors showing anywhere. However, every time i try to perform a mvn clean install from the IDE in the TestIntegrator project it fails with the following error:

[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Non-resolvable import POM: Could not find artifact com.test:jms-dependencies-BOM:pom:0.0.1.SNAPSHOT @ line 43, column 16
[ERROR] 'dependencies.dependency.version' for com.test:amqdeps:jar is missing. @ line 104, column 14
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project com.test:IgniteIntegrator:0.0.1-SNAPSHOT (C:\Users\matrix\eclipse-mars\workspace\TestIntegrator\pom.xml) has 2 errors
[ERROR]     Non-resolvable import POM: Could not find artifact com.test:jms-dependencies-BOM:pom:0.0.1.SNAPSHOT @ line 43, column 16 -> [Help 2]
[ERROR]     'dependencies.dependency.version' for com.test:amqdeps:jar is missing. @ line 104, column 14
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

Can anyone help me out please?


Solution

  • The reason for this particular error seems to be a simple typo in the version string. Your are trying to import

    <jms-dependencies-BOM.version>0.0.1.SNAPSHOT</jms-dependencies-BOM.version>
    

    while the project version is actually

    <version>0.0.1-SNAPSHOT</version>
    

    Note the . vs - difference.

    That said, I do believe you should read more about Project Inheritance vs Project Aggregation and make sure you understand the details of how reactor builds work. Then perhaps you may want to re-think how you structure your modules. I'm not judging you (may be you have your good reasons to do what you do), but at first look it seams your multi-module structure is somewhat messy and thus fragile.