I have a maven project that contains two submodules, one depends on there other.
The project has no code but maven is ok with that. If I perform mvn package it passes ok and generates (empty) jar files.
However if I do mvn dependency:list I get the following error:
Failed to execute goal on project foob-two: Could not resolve dependencies for project com.example.foob:foob-two:jar:1.0.0-SNAPSHOT: Failure to find com.example.foob:foob-one:jar:1.0.0-SNAPSHOT in [Repo]
It seems like the maven dependency plugin only works after the modules have been uploaded to the local repo.
Strangely if I do the dependency list at the same time as package, ie mvn package dependency:list, it works. So it seems that maven has a different dependency resolution mechanism in some contexts.
Can anyone explain the behaviour? Can I run mvn dependency:list as a standalone command?
Here's the root pom:
<?xml version="1.0" encoding="UTF-8"?>
<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.example.foob</groupId>
<artifactId>foob</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<modules>
<module>foob-one</module>
<module>foob-two</module>
</modules>
</project>
Here's the first subproject:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<groupId>com.example.foob</groupId>
<artifactId>foob</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>foob-one</artifactId>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
</project>
Here's the second project:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<groupId>com.example.foob</groupId>
<artifactId>foob</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>foob-two</artifactId>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<dependencies>
<dependency>
<groupId>com.example.foob</groupId>
<artifactId>foob-one</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
mvn dependency:list can be run on its own. It appears as if your project is failing because of missing dependencies. Try mvn install first.
how to make one module depends on another module artifact in maven multi-modules
Related
I have the following plain pom running by Maven 3.0.4.
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>test</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
I am trying to override default settings in command line like this:
mvn -Dproject.build.finalName=build clean package
But this this is ignored, and I get test-1.0.jar. I've tried to change another properties, like outputDirectory, directory, artifactId, but also failed.
What is the proper way to do this thing?
See Introduction to the POM
finalName is created as:
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
</build>
One of the solutions is to add own property:
<properties>
<finalName>${project.artifactId}-${project.version}</finalName>
</properties>
<build>
<finalName>${finalName}</finalName>
</build>
And now try:
mvn -DfinalName=build clean package
I have a project with two modules in that. The parent POM looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>bc</artifactId>
<packaging>pom</packaging>
<version>1.3-SNAPSHOT</version>
<modules>
<module>njoy</module>
<module>api</module>
</modules>
</project>
The njoy module POM looks like this:
<?xml version="1.0" encoding="UTF-8"?> <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">
<parent>
<artifactId>bc</artifactId>
<groupId>org.example</groupId>
<version>1.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>njoy</artifactId>
<packaging>jar</packaging>
</project>
The api module POM looks like this:
<?xml version="1.0" encoding="UTF-8"?> <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">
<parent>
<artifactId>bc</artifactId>
<groupId>org.example</groupId>
<version>1.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api</artifactId>
<packaging>jar</packaging>
</project>
I have done mvn clean install for the parent POM so that it gets into my local m2 repository.
Now i want to use this project as a dependency in another project(say experiments) by providing it as dependency.
These are the folders created in my m2 repo.
This is my other project where i am using it as a dependency, and the POM for it looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>experiments</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>bc</artifactId>
<version>1.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>klk</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
But it cannot find the multi-module project artifact, where there is another dependency which is a single module project(klk) and there is no issue.
Please help. What am i missing here?
Thanks in advance!!
The artifact bc is just a pom with some modules. It cannot be used as a dependency. You probably thought you can reference "all artifacts" by referencing the parent POM. This is not possible.
The artifacts njoy and api are jars -- they can be used as a dependency of another project.
I am doing a Maven project with Intellj Idea in which I am trying to use neo4j.
I have an error of "unable resolve symbol neo4j" on (import org.neo4j.driver.v1.*;).
I have brought in the neo4j jar files to the project and believe I have a correctly set up pom file. I will post both though with this question below.
POM:
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>NeoImport</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>NeoImport</name>
<description>Import</description>
<dependencies>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
</build>
</project>
Project Setup:
Thanks!
This is how I create my multi-module maven project:
parent-module
mvn archetype:generate
archetypeGroupId : multimodule-project
archetypeArtifactId : parent-module
module-A
mvn archetype:generate
archetypeGroupId : multimodule-project
archetypeArtifactId : module-A
parent-module is the parent of module-A
After editing archetypeArtifactId from the parent pom
archetypeArtifactId : parent-module-edit
I get the error:
Some problems were encountered while building the effective model for multimodule-project:module-A:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.felix:maven-bundle-plugin is missing. # multimodule-project:module-A:[unknown-version], D:\mmvnproject\module-A\pom.xml, line 54, column 12
How should I go about properly editing a maven project archetypeArtifactId? Is there a database where these settings are stored, so that one would have to edit them there too, and not only the pom?
UPDATE
parent-module pom
<?xml version="1.0" encoding="UTF-8"?>
<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>multimodule-project</groupId>
<artifactId>parent-module</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>parent-module</name>
<modules>
<module>module-A</module>
</modules>
</project>
module-A pom
<?xml version="1.0" encoding="UTF-8"?>
<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>
<artifactId>module-A</artifactId>
<version>1.0</version>
<packaging>bundle</packaging>
<parent>
<groupId>multimodule-project</groupId>
<artifactId>parent-module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
</project>
Your module-A pom is wrong you should have the underneath pom to make it works :
<?xml version="1.0" encoding="UTF-8"?>
<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>
<artifactId>module-A</artifactId>
<version>1.0</version>
<packaging>bundle</packaging>
<parent>
<groupId>multimodule-project</groupId>
<artifactId>parent-module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
</project>
EDIT : Update to add some thoughts because you have corrected your original post.
There is something weird with the archetype you are using. Normally, if it was well conceived you just have to execute mvn archetype:generate once. I think because your archetype is not already a multimodule project what is explained your difficulties to set your workspace correctly with it.
If you can modify your archetype by following this tutorial for creating a good multi-module archetype, I do think it will be easier to use.
Data-Layer pom file:
<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.ehr</groupId>
<artifactId>parentEHR</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Data-Layer</artifactId>
<packaging>jar</packaging>
</project>
Core-layer pom file
<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.ehr</groupid>
<artifactId>parentEHR</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Core-Layer</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.ehr</groupId>
<artifactId>Data-Layer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Error:
Failed to execute goal on project Core-Layer: Could not resolve dependencies for project com.ehr:Core-Layer:jar:0.0.1-SNAPSHOT: Failed to collect dependencies at com.ehr:Data-Layer:jar:0.0.1-SNAPSHOT: Failed to read artifact descriptor for com.ehr:Data-Layer:jar:0.0.1-SNAPSHOT: Could not find artifact com.ehr:parentEHR:pom:0.0.1-SNAPSHOT -> [Help 1]
The above error occurs.
Can any one help me?
You need to make sure that modules (children) are defined in the parent as well as modules defining their parent in their own pom.
In parent pom:
<modules>
<module>Core-Layer</module>
<module>Data-Layer</module>
</modules>
And then start a build from within the parent folder, which will build the modules in order (from top to bottom).
If your dependency project is built successfully, then maven should find that artifact in your local repository, when building the current project(in your case, 'Core-Layer').
Make sure you build your data-layer project with the command 'mvn install'.This command updates your local repository with the artifact.
If the maven build is successful, verify the artifact in your local repository.(Generally ${current_user}.m2\repositories\com\ehr).
If the artifact of data-layer is available there, then maven will read it from there, whenever you are referring it with that artifact id.
Assuming parentEHR is your parent project and Core-Layer, Data-Layer are child projects of the same. pom.xml of each should look like as:
parentEHR - pom.xml
<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.ehr</groupId>
<artifactId>parentEHR</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../Data-Layer</module>
<module>../Core-Layer</module>
</modules>
</project>
Core-Layer - pom.xml
<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.ehr</groupId>
<artifactId>Core-Layer</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ehr</groupId>
<artifactId>parentEHR</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parentEHR</relativePath>
</parent>
</project>
Data-Layer - pom.xml
<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.ehr</groupId>
<artifactId>Data-Layer</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ehr</groupId>
<artifactId>parentEHR</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parentEHR</relativePath>
</parent>
</project>