Manage maven project version by profiles not by parent - maven

I have a parent tag in pom.xml like this:
<parent>
<groupId>com.de</groupId>
<artifactId>MyApplication</artifactId>
<version>2.5.7-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
Also I have different profiles:
<profiles>
<profile>
<id>default-environment-settings</id>
<properties>
<app.env>dev</app.env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>xyz</id>
<properties>
<app.env>profile2</app.env>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profiles>
Now I want that my application's version is managed by profiles not as a global parent so that each profile can have it's private version number.

Did you try this ?
<profiles>
<profile>
<id>default-environment-settings</id>
<properties>
<app.env>dev</app.env>
<projectVersion>1.0-SNAPSHOT</projectVersion>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>xyz</id>
<properties>
<app.env>profile2</app.env>
<projectVersion>1.0</projectVersion>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profiles>
And don't forget to put on your artifact
<version>${projectVersion}</version>

Profiles are not intended to declare POM's versions. If you define profiles as mentioned in eclideria's answer and your parent's POM with:
<groupId>com.de</groupId>
<artifactId>MyApplication</artifactId>
<version>${projectVersion}</version>
it will result in:
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.de:MyApplication:jar:1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. # com.de:MyApplication:${projectVersion}, ...MyApplication directory.../pom.xml, line ..., column ...
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

Related

Maven profiles change groupId

We have three profiles and each one needs to set name and groupId for our clients, but my solution shows warnings in Jenkins compilation and haven't transitive dependencys. A part of my pom:
<artifactId>persistenceLib-${proyecto.nombre}</artifactId>
<version>1.0.0</version>
<groupId>${proyecto.groupId}</groupId>
<dependencies>...</dependencies>
<profiles>
<profile>
<id>client1</id>
<activation><activeByDefault>true</activeByDefault></activation>
<properties>
<proyecto.nombre>Client1Lib</proyecto.nombre>
<proyecto.groupId>com.Client1.product</proyecto.groupId>
</properties>
</profile>
<profile>
<id>client2</id>
<activation><activeByDefault>false</activeByDefault></activation>
<properties>
<proyecto.nombre>Client2Lib</proyecto.nombre>
<proyecto.groupId>com.Client2.product</proyecto.groupId>
</properties>
</profile>
<profile>
<id>client3</id>
<activation><activeByDefault>false</activeByDefault></activation>
<properties>
<proyecto.nombre>Client3Lib</proyecto.nombre>
<proyecto.groupId>com.Client3.product</proyecto.groupId>
</properties>
</profile>
</profiles>
¿What is the correct way for a dynamic IDs?

Can't reach maven profile property 'spring.profiles.active' from application.properties file after upgrade spring-boot-starter-parent

I upgraded spring-boot-starter-parent from 2.3.1 till 2.5.5 and now 'spring.profiles.active' property can't be injected from pom to application.properties file. Instead of profile value I get in console "The following profiles are active #spring.active.profile#"
My .pom file
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>
application.properties
spring.profile.active=#spring.profile.active#

How to acess a property under specific profile in Maven

I have 2 pom files - ParentPOM and ChildPOM. I want to Access property1 in ParentPOM in ChildPOM. I know this can be done by making ParentPOM as the parent for ChildPOM and use ${property1}. But property1 is defined in 2 profiles - trunk and release and I always want to get the value of property1 defined in release. How do I do that? ie:- In the below example, I want the value should be 0.0.2 and not 0.0.1 when I Access property1 in ChildPOM.
Note:I cannot modify ParentPOM
<project>
<modelVersion>x.x.x</modelVersion>
<artifactId>ParentPOM</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>ParentPOM</name>
<profiles>
<profile>
<id>trunk</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<property1>0.0.1</property1>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<property1>0.0.2</property1>
</properties>
</profile>
</profiles>
</project>
<project>
<modelVersion>x.x.x</modelVersion>
<parent>
<groupId>com.temp</groupId>
<artifactId>ParentPOM</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>ChildPOM</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<name>ChildPOM</name>
<profiles>
<profile>
<id>trunk</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<property1>x.x.x</property1>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<property1>y.y.y</property1>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx</artifactId>
<version>${property1}</version>
</dependency>
</dependencies>
</project>
Introduce a property "releaseProperty1" in your parent pom. Use this property both for the definition of "property1" in the profile "release" and for your use cases in the child pom.
There is one cleanish solution, but it all depends on the why... why do you want this?
The solution is: removing the release-profile from child and execute Maven like this: mvn <goal> -Prelease,!trunk, i.e enable release profile and disable trunk profile.
To confirm this solution, run mvn help:evaluate -Dexpression=property1 -Prelease,!trunk

maven error after importing latest code from github

I get the following after i pull the latest code from the githud repository.
problem encountered while building effective model for org.codehaus.mo
The full description of the error is below.
1 problem was encountered while building the effective model for
org.codehaus.mojo:aspectj-maven-plugin:1.8
[ERROR] 'dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${toolsjarSystemPath} #
I am using java1.8 and sts 3.6.4
Most likely JAVA_HOME environmental variable points to JDK instead of JRE. Change the environment variable and restart Eclipse.
aspectj-maven-plugin contains following:
<profile>
<id>standardToolsJar-profile</id>
<activation>
<activeByDefault>true</activeByDefault>
<file>
<exists>${java.home}/../lib/tools.jar</exists>
</file>
</activation>
<properties>
<toolsjarSystemPath>${java.home}/../lib/tools.jar</toolsjarSystemPath>
</properties>
</profile>
<profile>
<id>appleJdkToolsJar-profile</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>${java.home}/../Classes/classes.jar</exists>
</file>
</activation>
<properties>
<toolsjarSystemPath>${java.home}/../Classes/classes.jar</toolsjarSystemPath>
</properties>
</profile>
<profile>
<id>java8</id>
<activation>
<jdk>1.8</jdk>
</activation>
<properties>
<additionalparam>-Xdoclint:none</additionalparam>
</properties>
</profile>
I think the reason this fails is that activeByDefault will not trigger because java8 profile activation is triggered. file->exists condition will not trigger because of incorrect ${java.home}. ${toolsjarSystemPath} will not get set, and attempt to use it will cause the exception.

How to generate two sonar reports from the same project?

I would like to create two sets of Sonar reports from the same project. One would have everything covered and the other one would have some packages excluded.
Is this possible and if so, how to do such?
Edit: Setting exclusions is not a problem but having two reports is.
Create new profile in maven and add call sonar with new branch for each profile: mvn clean install -Pprofile1 sonar:sonar -Dsonar.branch=BRANCH1
<properties>
<sonar.branch>
DEFAULT_BRANCH
</sonar.branch>
</properties>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
<profile>
<id>profile1</id>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>

Resources