Version management in Maven - maven-3

I have two different projects. Project_1 is a maven multi-module project. Project_2 depends on some modules of the Project_2. I have declared a version property in parent POM of Project_1 and referred in the child POM like below.
Project_1 Parent POM
<groupid>x</groupid>
<artifactid>y</artifactid>
<version>${app.version}</version>
<properties>
<app.version>1.0.0</app.version>
</properties>
Project_1 Child POM
<parent>
<groupid>x</groupid>
<artifactid>y</artifactid>
<version>${app.version}</version>
</parent>
<artifactid>y1</artifactid>
Project_2 POM
<dependency>
<groupid>x</groupid>
<artifactid>y</artifactid>
<groupid>1.0.0</groupid>
</dependency>
I have installed Project_1 using "mvn clean install" in the local repository but the problem is Project_1 and its module pom and its dependencies installed in the local repo is with version ${app.version}. Due to this, If I refer the Project_1 or its modules as a dependency in Project_2 with the actual version 1.0.0, its throwing error that it can't find version 1.0.0
Is there any way to solve this? during install of Project_1, I like to override the key {app.version} with actual in the local repo.

The same can be achieved by flatten-maven-plugin.
In case of Parent version include, flatten-maven-plugin can be used with xml-maven-plugin.

Related

grails 2.5.x does not evict oldest version of conflicting library

Using grails 2.5.1 with, in BuildConfig.groovy
[...]
grails.project.dependency.resolver = "maven"
[...]
I have a grails application including 2 custom plugins (hosted on our nexus maven repo): gw-mr:1.7.3-RELEASE and gw-mr-security:1.7.4-RELEASE
These 2 plugins depend on the same library, mr-client. However gw-mr lags behind gw-mr-security and was not rebuilt for some time, but its code has not changed. In the meantime, gw-mr-security has been bumped, and uses a newer version of the common library: mr-client. So if we take a look at the POM of gw-mr:
[...]
<dependency>
<groupId>irrelevant</groupId>
<artifactId>mr-client</artifactId>
<version>3.6.5-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
[...]
And looking at the POM of gw-mr-security, we see:
[...]
<dependency>
<groupId>irrelevant</groupId>
<artifactId>mr-client</artifactId>
<version>3.9.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
[...]
So, indeed, gw-mr-security declares a later version of mr-client than gw-mr.
When I include these 2 plugins in the host grails application, I can see something really weird, when I run grails dependency-report compile:
[...]
+--- irrelevant:gw-mr:1.7.3-RELEASE
| \--- irrelevant:mr-client:3.6.5-20170921.151252-2
+--- irrelevant:gw-mr-security:1.7.4-RELEASE
+--- irrelevant:gw-rest:1.7.8-RELEASE
[...]
So, even though my app declares both plugins in its dependencies (BuildConfig.groovy):
[...]
compile "irrelevant:gw-mr:1.7.3-RELEASE"
compile "irrelevant:gw-mr-security:1.7.4-RELEASE"
[...]
grails still does not examine both transitive dependencies and evicts the dependency coming from gw-mr (3.6.5-SNAPSHOT) for more recent version included in gw-mr-security (3.9.0-SNAPSHOT).
Of course, when I include the transitive dependency explicitly in my host application:
[...]
compile "irrelevant:mr-client:3.9.0-SNAPSHOT"
[...]
Then the right library is packaged in my war.
Is my assumption wrong, that grails evicts older versions of the transitive dependencies included by plugins?
Thanks for any insight.

Missing artifact for apache-drill

I am following documentation. As metioned there, I used the following dependency:
<dependency>
<groupId>org.apache.drill.exec</groupId>
<artifactId>drill-java-exec</artifactId>
<version>1.0.0</version>
</dependency>
While building maven project, I got an error:
Missing artifact org.apache.drill.exec:drill-java-exec:jar:1.0.0
How to resolve this?
In the maven central repository, I only see version 1.1.0 not 1.0.0
<dependency>
<groupId>org.apache.drill.exec</groupId>
<artifactId>drill-java-exec</artifactId>
<version>1.1.0</version>
</dependency>
Maybe you need to change your version.
Drill's artifacts are not in maven central, so install them from your local Drill installation:
mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-java-exec-1.0.0-rebuffed.jar -DgroupId=org.apache.drill.exec -DartifactId=drill-java-exec -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-common-1.0.0-rebuffed.jar -DgroupId=org.apache.drill -DartifactId=drill-common -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true

why axis-1.4.jar is dependent upon wsdl4j-1.5.1 jar file in maven

Container is already having wsdl4j-1.5.1.jar. I have observed that when I have written only
axis1.4 dependency code in my pom.xml, it automatically downloading axis-wsdl4j-1.5.1.jar file which is also
creating problem to my existing application. could you please let me know,
why axis jar is internally downloading wsdl file and how to remove this
internal dependency
Like we declare needed artifacts as maven dependencies in pom for our java project, artifacts(declared as dependencies) are also projects and need other artifacts(dependencies).
According to this url, artifact-axis-1.4.jar is using artifact-axis-wsdl4j-1.5.1.
That is why when you are trying to download the axis-1.4.jar, maven is automatically downloading its corresponding dependency - axis-wsdl4j-1.5.1.
If your container is providing wsdl jar then you can tell maven to not to download axis-wsdl4j-1.5.1.jar, by using the exclude tag in your pom file, like below -
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
<exclusions>
<exclusion>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
</exclusion>
</exclusions>
</dependency>
Above declaration should solve your jar clashing problem.
You can refer to this url suggested by Timo, to get the detailed explanation of exclude tag. *

pom.xml setting the version of the parent project

In our pom.xml, I need to set the version of the parent project to an environment variable:
example:
<parent>
<groupId>edu.university.se.se_parent_project</groupId>
<artifactId>SE_ParentProject</artifactId>
<version>${parent.version}</version>
<relativePath>../SE_ParentProject/pom.xml</relativePath>
</parent>
How do I do that?
using ${parent.version} is giving me this error:
[ERROR] Non-resolvable parent POM: Could not transfer artifact edu.university.se.se_parent_project:SE_ParentProject:pom:${parent.version} from/to central
Replace ${parent.version} with ${env.PARENT_VERSION} and add this environment variable to your OS
PARENT_VERSION=1.0.0-SNAPSHOT

Non-resolvable parent POM: When building Maven 3 Project Site

I am currently facing the following problem with Maven 3 when I am trying to build the site. I will appreciate you help on this.
mvn clean site
..........
[INFO] Reactor Summary:
[INFO]
[INFO] Project A ......................................... SUCCESS [15.383s]
[INFO] Project B ......................................... SUCCESS [2.232s]
[INFO] My Site ........................................... FAILURE [0.105s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.769s
[INFO] Finished at: Fri Jun 29 14:26:04 AMT 2012
[INFO] Final Memory: 18M/150M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.1:site (default-site) on project site: SiteToolException: Unable to read local module-POM: 1 problem was encountered while building the effective model for my.com:projA:0.1-SNAPSHOT
[ERROR] [FATAL] Non-resolvable parent POM: Could not find artifact my.com:parent-pom:pom:0.1-SNAPSHOT and 'parent.relativePath' points at no local POM # line 12, column 13
[ERROR] for project my.com:projA:0.1-SNAPSHOT
.............
First here is the configuration:
Apache Maven 3.0.4 (r1232337; 2012-01-17 12:44:56+0400)
Java version: 1.7.0_04, vendor: Oracle Corporation
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.7.4", arch: "x86_64", family: "mac"
Nexus repository: 2.0.6
The parent POM:
<modelVersion>4.0.0</modelVersion>
<name>Parent POM</name>
<groupId>my.com</groupId>
<artifactId>parent-pom</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.1</version>
<configuration>
<reportPlugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.4</version>
</plugin>
</reportPlugins>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
The aggregation project pom:
<modelVersion>4.0.0</modelVersion>
<name>My Site</name>
<groupId>my.com</groupId>
<artifactId>site</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>my.com</groupId>
<artifactId>parent-pom</artifactId>
<version>0.1-SNAPSHOT</version>
<relativePath/>
</parent>
<modules>
<module>projA</module>
<module>projB</module>
</modules>
The pom of Project A:
<modelVersion>4.0.0</modelVersion>
<name>Project A</name>
<groupId>my.com</groupId>
<artifactId>projA</artifactId>
<version>0.1-SNAPSHOT</version>
<parent>
<groupId>my.com</groupId>
<artifactId>parent-pom</artifactId>
<version>0.1-SNAPSHOT</version>
<relativePath/>
</parent>
The pom of Project B:
4.0.0
<name>Project B</name>
<groupId>my.com</groupId>
<artifactId>projB</artifactId>
<version>0.1-SNAPSHOT</version>
<parent>
<groupId>my.com</groupId>
<artifactId>parent-pom</artifactId>
<version>0.1-SNAPSHOT</version>
<relativePath/>
</parent>
Here is the structure of the folder where I run "mvn clean site":
./pom.xml (aggregation project)
./projA/pom.xml (Project A)
./projB/pom.xml (Project B)
parent-pom is successfully deployed to NEXUS repository before the execution of mvn clean site with following command mvn deploy -DaltDeploymentRepository=snapshots::default::http://MyServer:8081/nexus/content/repositories/snapshots
And finally the problem itself:
When I run mvn clean site right after the deployment of parent-pom site is built successfully. If I delete the folder (with its content) "my" (it contains the parent-pom) from the local repository (~/.m2/repository) and then try to build the site with mvn clean site I am getting the error described at the beginning. Actually Maven downloads the parent-pom from the NEXUS. I have compared the downloaded files and files which have been generated after the deployment and have realized that few are missing, for instance maven-metadata-local.xml near to "0.1-SNAPSHOT" folder.
So when I am trying to run the site building job from Jenkins I am getting the error described above, because the parent-pom is not deployed from the machine where Jenkins run.
How can I come up with this problem or what I did wrong?
Thank you.
As pointed out by this answer, there is a bug in the site plugin, which only looks for dependencies in what it thinks is Maven central.
I am having the same problem in Maven 3.0.4 and site-plugin 3.3 . I also have the issue that it works in my development machine which is running Windows 7, but not in the CI-Server which is running Jenkins on Debian.
The problem is not in your pom files. When I built your aggregation-pom, Maven downloaded normally the parent-pom from the remote repo (after I deleted from my local repo).
Try this:
mvn -U clean install site dependency:purge-local-repository
Additionally, you could do some clean up:
remove <relativePath/> from all of them
remove <version>0.1-SNAPSHOT</version> and <groupId>my.com</groupId> from projA and ProjB (they are inherited from the parent)
I got the same problem... works on my developer MacBook, but fails on my Jenkins running on RHEL7 when running mvn site using maven-site-plugin:3.7. I did not test to downgrade the site plugin.
I found another solution. The problem in my case was the maven-project-info-reports-plugin especially the goal dependencies. If I skip the goal with -Dmpir.skip=true my site get's generated (without the dependencies :( report).

Resources