Different SCM for different profiles in Maven - maven

In my project we have to use maben-build-number plugin to construct the final name of the jar, for that purpose we use the revision of the SCN, so we need SCM
But we have two SVN on controlled environment without direct access and on our local test environment, so for our pouproses we have to use:
<scm>
<connection>scm:svn:http://dev.com/svn_repo/trunk</connection>
<developerConnection>scm:svn:https://dev.com/svn_repo/trunk</developerConnection>
<url>http://dev.com/view.cvs</url>
</scm>
But for client env:
<scm>
<connection>scm:svn:http://client.com/svn_repo/trunk</connection>
<developerConnection>scm:svn:https://client.com/svn_repo/trunk</developerConnection>
<url>http://client.com/view.cvs</url>
</scm>
Is it possible to configure this in the different profiles. I tried
<profiles>
<profile>
<id>local</id>
<scm>
<connection>scm:svn:http://client.com/svn_repo/trunk</connection>
<developerConnection>scm:svn:https://client.com/svn_repo/trunk</developerConnection>
<url>http://client.com/view.cvs</url>
</scm>
</profile>
<profile>
<id>remote</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<scm>
<connection>scm:svn:http://client.com/svn_repo/trunk</connection>
<developerConnection>scm:svn:https://client.com/svn_repo/trunk</developerConnection>
<url>http://client.com/view.cvs</url>
</scm>
</profile>
</profiles>
But when I use the profile -Plocal, nothing happens?

I solved this problem by creating a property for the SCM connection details I need to change for different profiles. Here is a summary of what I did.
Defined the property and it's default value the properties block.
<properties>
<developerConnectionUrl><!-- developerConnection url here --></developerConnectionUrl>
</properties>
Set the scm block properties to use the global properties.
<scm>
<developerConnection>${developerConnectionUrl}</developerConnection>
</scm>
Created a profile which changes the global property as required.
<profiles>
<profile>
<id>local</id>
<properties>
<developerConnectionUrl><!-- developerConnectionUrl url for profile --></developerConnectionUrl>
</properties>
</profile>
</profiles>
As far as I know and from a quick scan of the schema the scm tag can only be used at the top level in the POM and is not valid inside the profile tag

Related

Set a property inside a maven profile conditionally, depending on another profile

Is there a way so that, inside a maven profile, I could set a property to one value or another, depending on whether another profile is also active ?
Example: for the sample below,
<profiles>
<profile>
<id>dev</id>
<properties>
<myProp>value-dev</myProp>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<myProp>value-prod</myProp>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<myProp>value-test</myProp>
</properties>
</profile>
</profiles>
if ONLY DEV is active, then I need myProp = value-dev
if DEV and TEST are active, then I need myProp = value-test
How can I achieve this ?
Thanks.

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.

maven settings custom properties

I'm completely new to Maven. I'm trying to set up a new project such that it doesn't require 20 page long word docs with screenshots to set it up. I've got developers on Macs and PCs, so I need to be able to customize the catalina.home directory as I can't just impose a standard location. I thought I'd do it in the ~/.m2/settings.xml file with the following:
<profile>
<id>my-site-dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<catalina.home>/path/to/apache-tomcat</catalina.home>
</properties>
</profile>
However, the documentation here: http://maven.apache.org/guides/introduction/introduction-to-profiles.html#Profile_Pitfalls seems to indicate that what I'm trying to accomplish is a bad idea. What's the official way of accomplishing this so that in my pom.xml I can just reference ${catalina.home}?
And now that I've declared my profile with an id, can I fail the build if my pom.xml can't load the profile "my-site-dev"? I'd like to get that <activeByDefault> out of the settings.xml if at all possible. I don't want to interfere with their global settings for no reason, I'd like to keep as much of it self contained as possible.
Don't use activeByDefault, since it will cloak all other profiles:
Here is what you should use:
<profiles>
<profile>
<id>path-to-catalina.home-linux</id>
<activation>
<os>
<family>linux</family>
</os>
</activation>
<properties>
<catalina.home>...</catalina.home>
</properties>
</profile>
<profile>
<id>path-to-catalina.home-mac</id>
<activation>
<os>
<family>mac</family>
</os>
</activation>
<properties>
<catalina.home>...</catalina.home>
</properties>
</profile>
<profile>
<id>path-to-catalina.home-windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<properties>
<catalina.home>...</catalina.home>
</properties>
</profile>
You could use a profile in your pom that gets activated based on os.
<profiles>
<profile>
<activation>
<os>
...
What are you doing that require catalina.home?
If you're doing deployment to an app server with maven, you are already outside of the 'consistent, portable build' rule set - and outside of the main use case / best practices for maven.
Not that you shouldn't do it - as it's convenient. Just make sure to separate your build projects from the deployment projects.

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>

Accessing Project Properties from settings.xml

I'm trying to activate a profile in my settings.xml by the value of the pom's groupId. To achieve that I have:
<settings>
<profiles>
<profile>
<id>imf</id>
<activation>
<property>
<name>project.groupId</name>
<value>myId</value>
</property>
</activation>
<properties>
. . .
</properties>
</profile>
</profiles>
</settings>
But this doesn't work. Is it not possible to access project properties from settings? The reference material says you can.
Just to verify my use of the property activator element, I conducted a sanity check using a property set from the command line. Indeed, if I pass in -Dproject.groupId=myId to the mvn command line, my activation works. This leads me to believe that the project properties simply aren't available in the settings.xml file.
It looks like your specific requirement cannot be achieved in the way you have tried.
project.groupId as a property name (or key) does not mean anything to maven. maven understands (and expands) ${project.groupId} and similar values in settings.xml or pom.xml.
I had a similar requirement - choosing between profiles depending on the groupId of the project (to choose between remote repositories). Then I noticed that my groupIds are always actually package names in my java class hierarchy. And package names are just simply directories in the filesystem. So my solution to this problem was to use the actication/file/exists tag:
<profiles>
<profile>
<id>client1</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>${basedir}/src/main/java/hu/client1</exists>
</file>
</activation>
<repositories>
<repository>
</repository>
</repositories>
</profile>
<profile>
<id>client2</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>${basedir}/src/main/java/hu/client2</exists>
</file>
</activation>
<repositories>
<repository>
</repository>
</repositories>
</profile>
<profile>
<id>client3</id>
<activation>
<activeByDefault>false</activeByDefault>
<file>
<exists>${basedir}/src/main/java/com/client3</exists>
</file>
</activation>
<repositories>
<repository>
</repository>
</repositories>
</profile>
</profiles>

Resources