#Introduction
[P4Maven](https://swarm.workshop.perforce.com/files/guest/dantran/p4maven/main) is a
[Maven SCM provider](http://maven.apache.org/scm) using
[P4Java](http://www.perforce.com/perforce/doc.current/manuals/p4java-javadoc)
developed and open sourced by Perforce under BSD license in 1/2011.
In 6/2014, P4Maven was refactor to provide the following improvements:
* Auto discover existing Perforce client of a given source tree
User is no longer required to configure the client name via Java system properties.
* Client are persisted and shared by multiple commands
* Auto generated clients are destroyed after each JVM session (ie auto cleanup).
* Full integration with Maven SCM and Release plugin.
User now can release Maven project with Perforce SCM using one command ( mvn -B release:preare release:perform)
* Comply with Maven Scm's Technology Compatibility Kit (TCK)
* Added Lots of Maven Plugin Integration Tests.
Due to large changes to the codebase, this provider and its accompany plugin have a new groupId and aritifactId -
com.perforce.p4maven:p4maven-provider and com.perforce.p4maven:p4maven-mojo respectively.
It also has a more comprehensive URL format.
This provider is not the same provider developed at Apache Maven SCM team, which uses p4 command line to
interact with Perforce server.
#SCM URL
The general format for a Perforce P4Maven SCM URL is
scm:p4:[protocol:][[username[:password]@]hostname:port:]//depot/path/to/project
#SCM URL Examples
Generic URL to work with multiple sites using Perforce proxy nodes. The host and protocol properties must be configured using global configuration.
scm:p4://depot/path/to/project
Single Perforce server with no proxy
scm:p4:host://depot/path/to/project
scm:p4:ssl:host:3666://depot/path/to/project
Testing only due to exposure of credentials
scm:p4:ssl:user:password@host:3666://depot/path/to/project
Notes:
* 'tcp' is implicitly used when protocol field is not given. See Perforce documentation to see a list of
supported protocols. However, as of this writing P4Maven provider supports only 'tcp' and 'ssl' protocols
# Provider Global Configuration
User can configure provide global configurations using:
* External ${user.home}/.m2/p4maven-settings.xml
* External environment variables
* External Java system properties
The XML configuration has the following format
value
value
[...]
These settings are always overridable from command line using Java system properties (ie -Dkey=value ) if allow.
They are overridable from system environment only when existing values are empty if allow.
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| p4maven-settings Key | ENV Key | System Property | Type | Default | Description |
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| p4Port | P4PORT | P4PORT |String | null | P4PORT info |
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| jobs | N/A | P4JOBS or |String | null | List of Perforce Job ID separated by space
| | | p4jobs | | | for any submit action like checkin
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| N/A | N/A | P4CLIENT or |String | null | A client name for SCM operations. If not
| | | p4client | | | given, it is self discovered or generated.
| | | | | | Not predictable when use with multiple SCM paths.
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| charset | P4CHARSET | P4CHARSET |String | null | Server connection charset
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| N/A | N/A | P4VERBOSE or |String | null | A client name for SCM operations. If not
| | | p4verbose | | | given, it is self discovered or generated.
| | | | | | Not predictable when use with multiple SCM paths.
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| lockTag | N/A | N/A |boolean | true | Lock the created label at tag action
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| allowTagUpdate | N/A | N/A |boolean | true | Allow the re-used of existing tag at tag action
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| strictClientDiscovery | N/A | strictClient |boolean | false | Whether the discovered client must have
| | | Discovery | | | its host field matches with the current host
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
| checkStaledConnection | N/A | N/A |boolean | false | Check for staled connection. Should turn
| | | | | | on for session longer then login session
*-----------------------+-----------+-----------------+--------+---------+------------------------------------------+
# Working with Maven SCM and Release Plugins
* Check out the source tree with a known client.
* Add this provider to plugin dependency
install
[...]
org.apache.maven.plugins
maven-release-plugin
[...]
com.perforce.p4maven
p4maven-provider
${p4maven.version}
[...]
org.apache.maven.plugins
maven-scm-plugin
[...]
com.perforce.p4maven
p4maven-provider
${p4maven.version}
[...]
org.codehaus.mojo
buildnumber-maven-plugin
[...]
com.perforce.p4maven
p4maven-provider
${p4maven.version}
[...]
[...]
[...]
* Configure SCM element in your project top level pom. Here are a couple of examples
scm:p4:workshop.perforce.com:1666://guest/dantran/p4maven
scm:p4:workshop.perforce.com:1666://guest/dantran/p4maven
https://swarm.workshop.perforce.com/files/guest/dantran/p4maven
scm:p4://guest/dantran/p4maven
scm:p4://guest/dantran/p4maven
https://swarm.workshop.perforce.com/files/guest/dantran/p4maven
* The credential can be configured using plugin's specific properties or hide it under your local's settings.xml via server element
...
hostname:port
username
password