+++ 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 minify org.apache.maven.plugins maven-war-plugin 2.1.1 **/js/** net.tqh.plugins uglifyjs-maven-plugin 1.0 src/main/webapp/js target/${project.name}-${version}/js prepare-package uglify ``` 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-plugin fully.qualified.MainClass jar-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-plugin 2.2-beta-2 create-test-dependency process-test-classes single gatecontrol false test-assembly.xml ``` De externe assembly file: ```xml testjar jar false ```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.bla bla-blie test tests ``` 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.mojo jaxws-maven-plugin ${org.codehaus.mojo.jaxws.maven.plugin.version} wsimport src/resources/wsdl com.x.interfaces.ws ${project.build.directory}/generated-sources/jaxws com.sun.xml.ws jaxws-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.maven2 maven-jaxb2-plugin ${org.jvnet.jaxb2.maven2.maven.jaxb2.plugin.version} crm_generation generate src/main/schema y.wsdl WSDL com.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.plugins maven-antrun-plugin install ``` 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 env env maven-antrun-plugin prepare-package run ``` ## Javadoc genereren Deze plugin nodig: ```xml org.apache.maven.plugins maven-javadoc-plugin 2.7 release/doc javadoc API 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.jetty maven-jetty-plugin 6.1.26 9966 comeet 5 8089 ``` :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-jetty pre-integration-test run 0 true stop-jetty post-integration-test stop ``` `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 env test http://blatomcat:8888/manager user pass ``` Die properties die hierboven staan worden dan in deze plugin ingevuld: ```xml org.codehaus.mojo tomcat-maven-plugin 1.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.plugins maven-eclipse-plugin true true ... 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 endtoend endtoend org.apache.maven.plugins maven-surefire-plugin integration-test test true false -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 test org.apache.maven.plugins maven-compiler-plugin UTF-8 1.6 1.6 ```