Maven ist ein Build-System für komplexe Projekte.

!Artifact manuell installieren
{{{
mvn install:install-file -DgroupId=com.intersult -DartifactId=com.intersult.skin -Dversion=1.0-SNAPSHOT -DgeneratePom=true -Dfile=com.intersult.skin-1.0-SNAPSHOT.jar -Dpackaging=jar
}}}

Zusätzlich kann mit -Dsources=<file> und -Djavadoc=<file> die Sourcen und Javadocs installiert werden.

!Artifact deployen
{{{
mvn deploy:deploy-file -DgroupId=com.intersult -DartifactId=com.intersult.skin -Dversion=1.0 -Dpackaging=jar -Dfile=target/com.intersult.skin-1.0-SNAPSHOT.jar -Durl=file://W:\deploy\repository.war -DrepositoryId=intersult-repository
}}}

{{{
C:\Java\workspace\import\agt-war>mvn deploy:deploy-file -DgroupId=ojdbc -DartifactId=ojdbc14 -Dversion=9.0.2.0.0 -Dpackaging=jar "-Dfile=C:\Java\lib\ojdbc14.jar" -DrepositoryId=intersult-repo -Durl=svn:https://intersult.com/svn/public/maven
}}}

Falls ein spezieller Wagon verwendet werden soll (Transportschicht für das Protocol-Handling), kann dieser und die Dependencies in <maven-home>/lib abgelegt werden (z.B. maven-svn-wagon-1.4.jar, svnkit-1.3.5.jar).

Beim deployen kann -Dsources=<file> und -Djavadoc=<file> __nicht__ verwendet werden, die Files müssen getrennt hochgeladen werden mit -Dpackaging=java-source und -DgeneratePom=false

!Glassfish deployen
__Achtung:__ Die [Intersult] hat das [Maven Glassfish Plugin] erweitert.
Command line:
{{{
mvn glassfish:deploy
}}}
Plugin config:
{{{
<plugin>
	<groupId>org.glassfish.maven.plugin</groupId>
	<artifactId>maven-glassfish-plugin</artifactId>
	<version>2.1</version>
	<configuration>
		<domain>
			<name>domain1</name>
			<adminPort>4848</adminPort>
		</domain>
		<glassfishDirectory>${env.GLASSFISH_HOME}</glassfishDirectory>
		<user>admin</user>
		<adminPassword>adminadmin</adminPassword>
		<echo>true</echo>
	</configuration>
</plugin>
}}}

!JBoss deployen
Command line:
{{{
mvn jboss:redeploy
}}}
Plugin config:
{{{
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>jboss-maven-plugin</artifactId>
	<version>1.4</version>
	<configuration>
		<hostName>localhost</hostName>
		<port>8080</port>
		<serverName>default</serverName>
		<fileNames>
			<fileName>${project.build.directory}/${project.build.finalName}.${project.packaging}</fileName>
		</fileNames>
	</configuration>
</plugin>
}}}

!Exec plugin
{{{
		<pluginRepository>
			<id>codehaus snapshot repository</id>
			<url>http://snapshots.repository.codehaus.org/</url>
			<releases>
				<enabled>true</enabled>
			</releases>
		</pluginRepository>
                ...
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>exec</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<executable>${env.GLASSFISH_HOME}/bin/asadmin</executable>
					<arguments>
						<argument>deploy</argument>
						<argument>target/test.war</argument>
					</arguments>
				</configuration>
			</plugin>
			
mvn exec:exec
}}}

!Manual ant task
{{{
	<profiles>
		<profile>
			<id>echo</id>
			<activation>
				<property>
					<name>command</name>
					<value>deploy</value>
				</property>
			</activation>
			<build>
				<defaultGoal>antrun:run</defaultGoal>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-antrun-plugin</artifactId>
						<version>1.3</version>
						<configuration>
							<tasks>
							    <echo>Hello World!</echo>
							</tasks>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
	
mvn -Dcommand=echo
}}}

!Ant als Plugin
{{{
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-antrun-plugin</artifactId>
				<version>1.7</version>
				<executions>
					<execution>
						<id>compile</id>
						<phase>compile</phase>
						<goals>
							<goal>run</goal>
						</goals>
						<configuration>
							<target>
								<echo message="${os.family}"/>
								<echo message="${os.arch}"/>
							</target>
						</configuration>
					</execution>
				</executions>
			</plugin>
}}}

!Links
* EAR-Plugin [http://maven.apache.org/plugins/maven-ear-plugin/modules.html]

!Debugging
Maven Prozesse können debuggt werden, indem statt mvn der Befehl mvnDebug verwendet wird. Maven wartet dann auf Port 8000 auf ein Debugger Attachement.

Tests können so nicht debuggt werden, da für sie eine eigene VM erzeugt wird. Dies kann verhindert werden, indem das Surefire-Plugin konfiguriert wird:

{{{
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.10</version>
				<configuration>
 					<forkMode>never</forkMode>
				</configuration>
			</plugin>
}}}

Allerdings können sich dann Probleme mit dem Classpath ergeben.

!Profile unter Hudson aktivieren
{{{
   <profile>
     <id>hudson</id>
     <activation>
         <property>
             <name>BUILD_NUMBER</name>
         </property>
     </activation>
     ...
   </profile>
}}}

!Authentication
Wird auf ein Repository zugegriffen, bei dem Authentifiziert werden muss (z.B. HTTPS, Username, Passwort), kann dies in den settings.xml abgelegt werden. Damit tauchen keine Passwörter in den eingecheckten pom.xml-Dateien auf:

{{{
	<servers>
		<server>
			<id>intersult-repo</id>
			<username>username</username>
			<password>passwort</password>
		</server>
	</servers>
}}}

!OS Profile
{{{
	<profiles>
		<profile>
			<id>win-32bit</id>
			<activation>
				<os>
					<family>windows</family>
					<arch>x86</arch>
				</os>
			</activation>
			<properties>
				<some.classifier>win-32bit</some.classifier>
			</properties>
		</profile>
		<profile>
			<id>win-64bit</id>
			<activation>
				<os>
					<family>windows</family>
					<arch>amd64</arch>
				</os>
			</activation>
			<properties>
				<some.classifier>win-64bit</some.classifier>
			</properties>
		</profile>
            </profiles>
}}}

!Proxy
Für normale Operationen mit Maven reicht ein Proxy-Eintrag im %USERPROFILE%\.m2\settings.xml

{{{
	<proxies>
		<proxy>
			<id>[id]</id>
			<active>true</active>
			<protocol>http</protocol>
			<host>[host]</host>
			<port>[port]</port>
			<nonProxyHosts>127.0.0.*|localhost|10.1.*</nonProxyHosts>
		</proxy>
	</proxies>
}}}

Beim Verwenden von Subversion-Operationen, zum Beispiel deploy:deploy-file ist zusätzlich das __SVN-Proxy__ im Subversion unter %APPDATA%\Subversion\servers anzugeben:

{{{
[global]
http-proxy-host = [host]
http-proxy-port = [port]
http-proxy-exceptions = 127.0.0.*, localhost, 10.1.*
}}}

!Eigener Wagon
Man kann sehr einfach eigene Wagons für den Transport schreiben, am besten man nimmt sich org.apache.maven.wagon:wagon-http-lightweight als Vorlage, bei Maven 2.2.1 ist dies Version 1.0.

Die eigentlich Wagons sind mit einer Annotation versehen:

{{{
/**
 * IntersultHttpWagon
 * 
 * @plexus.component role="org.apache.maven.wagon.Wagon" role-hint="http-intersult"
 *                   instantiation-strategy="per-lookup"
 */
public class IntersultHttpWagon extends StreamWagon {
    ...
}}}

Will man die Wagons verwenden, werden die im Build-Prozess des Target-Projecte einfach als Build-Extension eingebunden.

{{{
	<build>
		<extensions>
			<extension>
				<groupId>com.intersult</groupId>
				<artifactId>wagon-http-intersult</artifactId>
				<version>1.0-SNAPSHOT</version>
			</extension>
		</extensions>
            ...
}}}

Das Aktivieren als Default-Wagon für ein Protokoll (also HTTP, HTTPS etc.) erfolgt durch das Build-Kommando:

{{{
    mvn -Dmaven.wagon.provider.http=intersult install
}}}

Oder permanent in der settings.xml für bestimmte Server:

{{{
		<server>
			<id>intersult-repo</id>
			<configuration>
				<wagonProvider>intersult</wagonProvider>
			</configuration>
		</server>
}}}

Grundsätzlich hat Maven eine Fallback-Strategie, wenn der Wagon (noch) nicht geladen werden kann. Dies tritt insbesondere während des Bootstrap von Maven auf. Maven führt in diesem Fall generell einen Fallback auf die Standard-Wagons aus. Allerdings funktioniert das nicht, wenn der zu ladende Wagon sich in einem Repository befindet, für das genau dieser Wagon benötigt wird.