+++
title = "maven"
draft = false
tags = [
"code",
"build",
"maven"
]
date = "2013-06-05"
+++
# Maven2 Build stuff
:exclamation: **properties** guide: http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide
## javascript files automatisch minify-en
```xml
minifyorg.apache.maven.pluginsmaven-war-plugin2.1.1**/js/**net.tqh.pluginsuglifyjs-maven-plugin1.0src/main/webapp/jstarget/${project.name}-${version}/jsprepare-packageuglify
```
Bron: https:*github.com/mishoo/UglifyJS - maven plugin gebruikt `Rhino` om dit uit te voeren. Kan ook met `node` uitgevoerd worden - gebruik bij voorkeur `r.js` (zie http:*requirejs.org/docs/optimization.html)
## Argumenten als system property meegeven aan testen
Maven forkt by default dus `-Dbla=blie` gaat niet werken, dit is een property voor het maven java commando, maar niet voor de test zelf.
Oplossing: ` mvn test -DargLine######"-Dsystem.test.propertytest"`
**argLine** gebruiken. Zie:
1. http://www.cowtowncoder.com/blog/archives/2010/04/entry_385.html
2. [maven properties guide](http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide)
## Een single-deps jar mekan met maven assembly
```xml
maven-assembly-pluginfully.qualified.MainClassjar-with-dependencies
```
En dan met `mvn assembly:single` uitvoeren. Dit maakt in uw target dir een file genaamd `bla-1.0-SNAPSHOT-jar-with-dependencies.jar`. `java -jar [jar]` werkt dan.
## Een test jar maken met maven assembly
Met `maven assembly` kan je files packagen na het compileren van tests maar voor het runnen. Op die manier kunnen we dus bvb class files in een jar packagen (of resources in een zip). Daarna manueel installeren in de repository ofzoiets.
Plugin:
```xml
maven-assembly-plugin2.2-beta-2create-test-dependencyprocess-test-classessinglegatecontrolfalsetest-assembly.xml
```
De externe assembly file:
```xml
testjarjarfalse
```ets
```et
target/test-classes/**
```
:exclamation: test jars zijn precies niet **transitief** qua dependencies?
Als je een test-jar (die dus op `scope test` staat) wil includen in je eigen `assembly:single` jar, kan je `classifier tests` gebruiken:
```xml
be.blabla-blietesttests
```
Dan wordt die test jar mee gepackaged, maar zijn dependencies blijbkaar niet?
## Profiles en properties
#### activeByDefault
Zie http://java.dzone.com/articles/maven-profile-best-practices - **nooit** gebruiken! Waarom?
> This flag activates the profile if no other profile is activated. Consequently, it will fail to activate the profile if any other profile is activated. This seems like a simple rule which would be hard to misunderstand, but in fact it's surprisingly easy to be fooled by its behaviour. When you run a multimodule build, the activeByDefault flag will fail to operate when any profile is activated, even if the profile is not defined in the module where the activeByDefault flag occurs.
In plaats daar van:
```xml
!foo.bar
```
## JAXB generatie
#### Genereer endpoints vanaf WSDL
```xml
org.codehaus.mojojaxws-maven-plugin${org.codehaus.mojo.jaxws.maven.plugin.version}wsimportsrc/resources/wsdlcom.x.interfaces.ws${project.build.directory}/generated-sources/jaxwscom.sun.xml.wsjaxws-tools${com.sun.xml.ws.jaxws.version}
```
Zie http://rphgoossens.wordpress.com/2011/02/20/developing-a-contract-first-jax-ws-webservice/
Genereer de code met `mvn jaxws:wsimport` goal.
#### Genereer JAXB Java objecten vanaf XSD
Zelfde pincipe, andere `goal`:
```xml
org.jvnet.jaxb2.maven2maven-jaxb2-plugin${org.jvnet.jaxb2.maven2.maven.jaxb2.plugin.version}crm_generationgeneratesrc/main/schemay.wsdlWSDLcom.x.interfaces
```
## Integratie met Ant
Maven kan ook ant tasks uitvoeren. Dit door ant code te embedden in de pom.xml op de volgende manier:
```xml
org.apache.maven.pluginsmaven-antrun-plugininstall
```
Binnen de configuration tag zit ant code, met de ant tag roep ik een externe build xml aan. Op die manier kan je dus een ant buildfile volledig naast een pom.xml maven2 file plaatsen, en properties doorgeven! Die ant task wordt uitgevoerd met het commando `mvn antrun:run` of bij bepaalde geconfigureerde goals.
Voorbeeld: http://maven.apache.org/plugins/maven-antrun-plugin/
#### Aan bepaalde phase hangen
Zie http://www.avajava.com/tutorials/lessons/what-are-the-phases-of-the-maven-default-lifecycle.html
Om nog rap een property file te kopiëren, best aan `prapare-package` phase hangen (maven 2.1+):
```xml
envenvmaven-antrun-pluginprepare-packagerun
```
## Javadoc genereren
Deze plugin nodig:
```xml
org.apache.maven.pluginsmaven-javadoc-plugin2.7release/docjavadocAPI for ${project.name} ${project.version}API for ${project.name} ${project.version}
```
:exclamation: output dir = `${reportOutputDirectory}/${destDir}`
Voorbeeld: http://maven.apache.org/plugins/maven-javadoc-plugin/examples/output-configuration.html
## Deployen met maven
### Jetty integratie en auto-deploy
#### jetty run
Integratie met jetty en maven2: gebruik `mvn jetty:run` om automatisch de jetty server op te starten.
Het is ook mogelijk om die te laten scannen voor resource changes met `scanIntervalSeconds` - server start automatisch (normaal gezien...)
```xml
org.mortbay.jettymaven-jetty-plugin6.1.269966comeet58089
```
:exclamation: Vanaf Jetty plugin 7 zijn packages hernoemd en zo, zie http://wiki.eclipse.org/Jetty en de migratie van 6->7->...9
##### Debug poort instellingen
Gebruikt `MAVEN_OPTS` JVM parameters (omdat het proces niet geforked wordt?): http://docs.codehaus.org/display/JETTY/Debugging+with+the+Maven+Jetty+Plugin+inside+Eclipse
```
-Xdebug -Xnoagent -Djava.compiler######NONE -Xrunjdwp:transportdt_socket,address######4000,servery,suspend=y
```
##### JNDI Datasources definiëren
Kan in webapp/WEB-INF/jetty-env.xml:
```xml
jdbc/partnerwerkingDataSource${database.url}${database.user}${database.password}
```
wordt dan automatisch door `jetty:run` opgepikt.
#### auto-start bij integratie testen (failsafe plugin)
Als we aan bovenstaande plugin ook nog `executions` opgeven, start jetty automatisch bij `pre-integration-test` en stopt hij automatisch bij `-post-integration-test`:
```xml
start-jettypre-integration-testrun0truestop-jettypost-integration-teststop
```
`daemon` moet op **true** staan omdat de bovenstaande plugin (jetty6) geen fork doet en dan natuurlijk geen testen gedraaid worden...
### Tomcat deploy
Op verschillende omgevingen deployen kan door verschillende profielen aan te maken in de pom.xml file, en dan als env. parameter `-Denv=[gewenste env value]` de te deployen mee te geven:
```xml
envtesthttp://blatomcat:8888/manageruserpass
```
Die properties die hierboven staan worden dan in deze plugin ingevuld:
```xml
org.codehaus.mojotomcat-maven-plugin1.0-beta-1${server.url}${server.username}${server.password}
```
Uitvoeren met `mvn tomcat:deploy [-Denv=x]`
Voorbeelden en meer uitleg: http://mojo.codehaus.org/tomcat-maven-plugin/
## War name veranderen
Staat default op `${project.build.finalName}` wat neerkomt op artifactId-version.war.
Te veranderen door `blar` in `` te plaatsen in de `maven-war-plugin`.
**Zonder** .war ext. dus.
Zie http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#warName
## Jar source code downloaden
```
mvn dependency:sources
```
Ook mogelijk in de pom door per dependency `downloadSources` op `true` te zetten, of via de `eclipse:eclipse` goal plugin:
```xml
org.apache.maven.pluginsmaven-eclipse-plugintruetrue
... other stuff ...
```
Vergeet niet dan als property `-DdownloadSources=true` mee te geven.
#### eclipse:eclipse genereert ook de .project file
Library dependencies worden daar automatisch aan toegevoegd, maar alles staat onder **M2_REPO**/org/.../bla.jar en Eclipse moet weten waar lokaal de repository staat. Zie ook http://maven.apache.org/guides/mini/guide-ide-eclipse.html - Dit commando uitvoeren & eclipse herstarten:
`mvn -Declipse.workspace= eclipse:add-maven-repo`
#### Automatisch source files encoden
Je kan met die plugin ook extra configuratie meegeven die de `.java` files qua encoding goed zet:
```xml
```
.settings/org.eclipse.core.resources.prefs
${project.build.sourceEncoding}${line.separator}]]>
```
```
## Dependency tree tonen
```
mvn dependency:tree > deptree.out
```
Produceert rommel in het volgend formaat:
```
[INFO] [dependency:tree {execution: default-cli}]
[INFO] be.--api:jar:2.21-SNAPSHOT
[INFO] +- be.-support:jar:7.21-SNAPSHOT:compile
[INFO] | +- org.easytesting:fest-assert:jar:1.2:test (scope managed from compile)
[INFO] | | - org.easytesting:fest-util:jar:1.1:test
[INFO] | +- com.thoughtworks.xstream:xstream:jar:1.3.1:compile
[INFO] | | - xpp3:xpp3_min:jar:1.1.4c:compile
[INFO] | +- javax.ws.rs:jsr311-api:jar:1.1.1:compile
[INFO] | +- org.objenesis:objenesis:jar:1.2:compile
[INFO] | +- net.sf.ehcache:ehcache:jar:1.6.0:compile
[INFO] | +- log4j:log4j:jar:1.2.15:compile
[INFO] | | - javax.mail:mail:jar:1.4:compile
[INFO] | +- commons-codec:commons-codec:jar:1.3:compile
[INFO] | +- jmimemagic:jmimemagic:jar:0.1.2:compile
[INFO] | | +- oro:oro:jar:2.0.8:compile
[INFO] | | - commons-logging:commons-logging:jar:1.1.1:compile (version managed from 1.0.4)
[INFO] | +- commons-io:commons-io:jar:1.4:compile
[INFO] | +- org.htmlcleaner:htmlcleaner:jar:2.1:compile
..
```
## Een bepaalde test draaien via Maven
```
mvn test -Dtest=[testClass] -P [profile]
```
Waarbij `profile` het profiel is die de surefire plugin heeft - bijvoorbeeld:
```xml
endtoendendtoendorg.apache.maven.pluginsmaven-surefire-pluginintegration-testtesttruefalse-Xms128M -Xmx512M -XX:MaxPermSize=512M
```
:exclamation: Als een bepaalde jar nog deployed moet worden (naar Jetty bvb) voor het runnen van de test (scenario testen zoals selenium en webdriver), moet de `install` in plaats van `test` goal uitgevoerd worden.
Het kan *ook* zijn dat nog zaken geïnstalleerd moeten worden in de lokale Maven repository (het root project) -> eerst `mvn clean install` op het root project doen (voor *vac* is dit zo). Dit is omdat het endtoend project daarop afhangt, en de compile dan faalt.
## Een jar manueel in de repository installeren
Gebruik het volgende commando:
> `mvn install:install-file -Dfile######x.jar -DgroupIdcom.group -DartifactId######jarName -Dversion1.0.0 -Dpackaging=jar`
Wens je dit in de **remote repository** te installeren, gebruik dan `mvn deploy:deploy-file` met als extra parameter de url van de repository via de `-Durl=repoUrl` optie.
## De maven java compiler versie goed zetten
Gebeurt in een plugin in de `build` fase:
```xml
testorg.apache.maven.pluginsmaven-compiler-pluginUTF-81.6
```