Sie sind auf Seite 1von 55

Maven project automation for dummies

Aino Andriessen
AMIS

dec 20, 2007

Continuous Integration

Continuous integration is the practice where


the work of all the developers are integrated,
analyzed and verified on a regular basis,
preferably multiple times a day.
It takes the latest situation from the source
control system, performs unit tests, makes a
build, deploys the application, performs
integration tests and creates reports about
these steps and communicates them with the
team, all automatically without human
interaction.

dec 20, 2007

Conditions

Infrastructure
Scripting
No IDE

dec 20, 2007

Scripting

Maven
ant
make
shell scripts
sql scripts
...

dec 20, 2007

Demo

dec 20, 2007

Maven execution info

[INFO] Scanning for projects...


[INFO] Reactor build order:
[INFO]
HR1
[INFO]
HR1 model
[INFO]
HR1 viewController
[INFO]
HR1 ear
[INFO]
HR1 integration
[INFO] ------------------------Downloading: http://repo1.maven.org/maven2/junit/junit/3.8.1/junit-3.8.1.jar
118K downloaded
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]
[INFO]

-----------------------------------------------------------------------Reactor Summary:
-----------------------------------------------------------------------HR1 ................................................... SUCCESS [3.003s]
HR1 model ............................................. SUCCESS [7.866s]
HR1 viewController .................................... SUCCESS [54.451s]
HR1 ear ............................................... SUCCESS [14.591s]
HR1 integration ....................................... SUCCESS [0.312s]
----------------------------------------------------------------------------------------------------------------------------------------------BUILD SUCCESSFUL
-----------------------------------------------------------------------Total time: 1 minute 20 seconds
Finished at: Fri Jun 01 17:32:01 CEST 2007
Final Memory: 10M/18M
-----------------------------------------------------------------------

dec 20, 2007

mvn test

[INFO] [surefire:test]
[INFO] Surefire report directory: D:\projects\myprojects\odtugDemo\hr1\model\tar
get\surefire-reports
------------------------------------------------------TESTS
------------------------------------------------------Running nl.amis.demo.odtug.model.queries.OdtugTstViewTest
Jun 1, 2007 7:04:22 PM oracle.adf.share.config.ADFConfigFactory findOrCreateADFC
onfig
INFO: oracle.adf.share.config.ADFConfigFactory No META-INF/adf-config.xml found
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.606 sec
Running nl.amis.demo.odtug.model.queries.RegionsViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec
Running nl.amis.adf.fwk.test.Java5Test
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
Running nl.amis.demo.odtug.model.queries.JobsViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 sec
Running nl.amis.demo.odtug.model.queries.EmployeesViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec
Running nl.amis.demo.odtug.model.queries.DepartmentsViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec
Running nl.amis.demo.odtug.model.queries.LocationsViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
Running nl.amis.demo.odtug.model.queries.CountriesViewTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec
Results :
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

dec 20, 2007

mvn package

[INFO] Building HR1


[INFO] task-segment: [package]
[INFO] --------------------------[INFO] [jar:jar]
[INFO] Building jar: D:\projects\myprojects\odtugDemo\hr1\model\target\hr1-model-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------[INFO] [war:war]
[INFO] Building war: D:\projects\myprojects\odtugDemo\hr1\viewController\target\hr1-viewController-1.0SNAPSHOT.war
[INFO] [ear:ear]
[INFO] Copying artifact[war:nl.amis.demo.odtug.hr1:hr1-viewController:1.0-SNAPSHOT] to[hr1-viewController-1.0SNAPSHOT.war]
[INFO] Copying artifact[jar:log4j:log4j:1.2.12] to[log4j-1.2.12.jar]
[INFO] Copying artifact[jar:commons-logging:commons-logging:1.0.4] to[commons-logging-1.0.4.jar]
[INFO] Could not find manifest file: D:\projects\myprojects\odtugDemo\hr1\ear\src\main\application\METAINF\MANIFEST.MF - Generating one
[INFO] Building jar: D:\projects\myprojects\odtugDemo\hr1\ear\target\hr1-ear-1.0-SNAPSHOT.ear
[INFO] -------------------------------------------------------------------------

dec 20, 2007

mvn exec:exec -PlocalOC4J

[INFO] [exec:exec]
[[INFO] 07/06/01 17:21:22 Notification ==>Uploading file hr1.ear ...
[INFO]
[INFO] 07/06/01 17:21:22 Notification ==>Application Deployer for hr1 STARTS.
[INFO]
[INFO] 07/06/01 17:21:22 Notification ==>Copy the archive to :\server\oc4j_101310\j2ee\home\applications\hr1.ear
[INFO]
[INFO] 07/06/01 17:21:22 Notification ==>Initialize C:\server\oc4j_101310\j2ee\home\applications\hr1.ear begins...
[INFO]
[INFO] 07/06/01 17:21:24 Notification ==>Initialize hr1-viewController-1.0-SNAPSHOT begins...
[INFO]
[INFO] 07/06/01 17:21:24 Notification ==>Initialize hr1-viewController-1.0-SNAPSHOT ends...
[INFO]
[INFO] 07/06/01 17:21:24 Notification ==>Started application : hr1
[INFO]
[INFO] 07/06/01 17:21:24 Notification ==>Binding web application(s) to site default-web-site begins...
[INFO]
[INFO] 07/06/01 17:21:24 Notification ==>Binding hr1-viewController-1.0-SNAPSHOT web-module for application
hr1 to site default-web-site under context root /hr1
[INFO]
[INFO] 07/06/01 17:21:31 Notification ==>Initializing Servlet: javax.faces.webapp.FacesServlet for web application
hr1-viewController-1.0-SNAPSHOT
[INFO]
[INFO] 07/06/01 17:21:31 Notification ==>Binding web application(s) to site default-web-site ends...
[INFO]
[INFO] 07/06/01 17:21:31 Notification ==>Application Deployer for hr1 COMPLETES.
Operation time: 8273 msecs

dec 20, 2007

mvn verify -PlocalOC4J

dec 20, 2007

10

mvn deploy

[INFO] [deploy:deploy]
[INFO] Retrieving previous build number from ATAMaven2SnapshotsRepo
Uploading: file:\\amis-test-aa\maven2snapshots/nl/amis/demo/odtug/hr1/hr1-model/1.0-SNAPSHOT/hr1-model-1.020070601.171522-4.jar
50K uploaded
[INFO] Retrieving previous metadata from ATAMaven2SnapshotsRepo
[INFO] Uploading repository metadata for: 'snapshot nl.amis.demo.odtug.hr1:hr1-model:1.0-SNAPSHOT'
[INFO] -------------------------------------------------------------------------

dec 20, 2007

11

mvn site

dec 20, 2007

12

Build automation server

dec 20, 2007

13

Demo Summary

ADF Faces application


Tasks

Unittesting
Make a build
Deploy ear file to OC4J
Perform integrationtests
Share artifacts
Share information

Without manual intervention and JDeveloper !

dec 20, 2007

14

Infrastructure

dec 20, 2007

15

Software Studio

dec 20, 2007

16

Software development

The development environment


Source control
Delivery environments
Issue management
Library management
Build automation / continuous integration
Reporting and documentation
Communication

dec 20, 2007

17

Nightly build

Continuum
Scheduler
http://ci.amis.nl:8080/continuum/servlet/continuum

dec 20, 2007

18

'Scripting' with Maven

dec 20, 2007

19

Maven

Project Object Model


Project objects
xml file

Build Lifecycle
actions / goals (tasks)

Dependency (library, artifact) Management


Reporting and Documentation
...

dec 20, 2007

20

Convention
over
configuration

dec 20, 2007

21

POM example

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>nl.amis.demo.odtug.hr1</groupId>
<artifactId>hr1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>model</module>
<module>viewController</module>
<module>ear</module>
</modules>
<name>HR1</name>
<description>This application manages employees and general company
information.</description>
<url>http://localhost:8800/hr1/faces/index.jspx</url>
<organization>
<name>AMIS Services</name>
<url>http://www.amis.nl</url>
</organization>
<issueManagement>
<system>Jira</system>
<url>http://dev.amis.nl/jira/browse/PAG</url>
</issueManagement>

dec 20, 2007

22

POM example

<scm>
<connection>scm:svn:http://subversion.amis.nl/users/aino_a/hr1/trunk/
</connection>
<developerConnection>
scm:svn:http://subversion.amis.nl/users/aino_a/hr1/trunk/
</developerConnection>
<url>http://subversion.amis.nl/users/aino_a/hr1/trunk/</url>
</scm>
<developers>
<developer>
<id>aino.andriessen</id>
<name>Aino Andriessen</name>
<email>aino.andriessen@amis.nl</email>
<organization>AMIS</organization>
<roles><role>developer</role></roles>
<timezone>+1</timezone>
</developer>
</developers>
<distributionManagement>
<repository>
<id>AMISMaven2Repo</id>
<url>file:\\ci.amis.nl\maven2</url>
</repository>
</distributionManagement>

dec 20, 2007

23

Pom Example

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>
src/main/resources/amis_checkstyle.xml
</configLocation>
</configuration>
</plugin>
</plugins>
</reporting>
</project>

dec 20, 2007

24

Build Lifecycle

Organized sequence of phases


like compile, test, package, build
etc. The actual work is done by
goals which are bound to a
certain phase.
Configuration (if necessary) in
pom
Other lifecycles
clean
site

validate
generate-sources
process-sources
generate-resources
process-resources
compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
deploy

dec 20, 2007

25

Execution

mvn compile
mvn compile:compile
mvn compile:test-compile

mvn package
mvn jar
mvn jar:jar
mvn jar:sign
mvn test-jar:jar

dec 20, 2007

26

Plugins

All 'tasks' are plugins


Written in java, ant

dec 20, 2007

27

Dependency Management

Defined in the POM


Downloaded from repository when needed
Stored in local repository
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.adf</groupId>
<artifactId>adfbinding</artifactId>
<version>10.1.3.39.84</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>nl.amis.demo.odtug.hr1</groupId>
<artifactId>hr1-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

dec 20, 2007

28

Maven repositories

dec 20, 2007

29

Maven repositories 2

Local
Internal
Central
http://repo1.maven.org/maven2/

External
Codehaus
java.net
...

dec 20, 2007

30

Internal repository

commercial libraries
non-public libraries
company products

dec 20, 2007

31

AMIS internal repositories

http://ci.amis.nl/maven2/

http://ci.amis.nl/maven2snapshots/

dec 20, 2007

32

Deploy

Upload the (created) artifact to the internal


repository
mvn deploy:deploy-file
deploy a library tot the repository

call mvn deploy:deploy-file


-DgroupId=com.oracle.jdbc
-DartifactId=ojdbc14
-Dversion=10.2.0.1
-Dfile=ojdbc14.jar
-Dpackaging=jar
-DrepositoryId=AMISMaven2Repository
-Durl=file:\\ci.amis.nl\maven2

dec 20, 2007

33

Snapshots

Dependency management for development


'releases'.

dec 20, 2007

34

Testing

Unittests
JUnit
TestNG

Integration tests
Database tests
...

dec 20, 2007

35

Integration tests

Start application server


Prepare the database
Deploy application

Run tests
Undeploy application
Stop application server

dec 20, 2007

36

Integration tests

Front-end
Selenium
JMeter

Back-end / Database
QCTO
utPLSQL

Tools

dbunit
Maven sql plugin
Maven exec plugin
(JDeveloper) ant tasks

dec 20, 2007

37

Release

mvn release:prepare
update version
tag in scm

mvn release:perform
deploy tagged version

artifact
sources
doc

create and deploy file

dec 20, 2007

38

Maven projectsites

Documentation
Project info
Reports
http://ci.amis.nl/projectsites/

dec 20, 2007

39

Maven 'bits and pieces'

Reports
Profiles
Archetype
Cargo plugin
Multi module projects
...

dec 20, 2007

40

ADF & JDeveloper & Maven

dec 20, 2007

41

Mavenize an ADF application

Dependency management
Crete or generate POM files
Tools

dec 20, 2007

42

Tools

admin_client.jar utility
deployment to OC4J

ojspc.jar utility
pre compilation of jsf files

[JDeveloper]
[oc4j]

dec 20, 2007

43

JDeveloper library management

JDeveloper has a great library management


system...
as long as you stay in JDeveloper
as long as you use the provided libraries

dec 20, 2007

44

Dependencies

Put (deploy) libraries in the internal repository


Keep pom file(s) in sync

call mvn deploy:deploy-file


-DgroupId=com.oracle.adf
-DartifactId=adfshare
-Dversion=%ADF_VERSION%
-Dfile=%JDEV_HOME%/BC4J/lib/adfshare.jar
-Dpackaging=jar
-DrepositoryId=%REPO_ID%
-Durl=%REPO_URL%
<dependencies>
<dependency>
<groupId>com.oracle.adf</groupId>
<artifactId>adfshare</artifactId>
<version>10.1.3.41.57</version>
<scope>provided</scope>
</dependency>
</dependencies>

dec 20, 2007

45

Required libraries

ADF

adfshare, adfui, adf-controller, adfbinding, adfm, bc4jdomorcl,


bc4jmt, bc4jct, bc4jdatum, bc4jhtml, datatags, graphtags,
bc4jimdomains, ordim
jhsadfrt, sqlj runtime

JDeveloper

oc4j-internal, oc4j, adf-faces-impl, adf-faces-api, jdev-cm, ojmisc,


xmlparserv2, ojsp, ojsputil

Other

sun collections 1.1, apache commons

Note : do NOT include log4j

ADF

10.1.3.0

10.1.3.36.73

10.1.3.1

10.1.3.39.84

10.1.3.2

10.1.3.40.66

10.1.3.3

10.1.3.41.57

dec 20, 2007

JDev

46

Application / Project organisation

Directory layout
Default Maven layout
JDev project settings

Application with multiple projects

dec 20, 2007

47

ADF Archetype

AMIS maven-archetype-adf :
mvn archetype:create
-DarchetypeGroupId=nl.amis.maven.archetypes
-DarchetypeArtifactId=maven-archetype-adf
-DarchetypeVersion=10.1.3.3[-SNAPSHOT]
-DremoteRepositories=http://ci.amis.nl/maven2(snapshots)
-DgroupId=nl.amis.demo
-DartifactId=hr1

dec 20, 2007

48

Projectfile generation

Create jws and jpr files


myFaces - Trinidad JDev plugin
org.apache.myfaces.trinidadbuild.maven-jdevplugin
version 1.2.5

Execute : mvn jdev:jdev


http://technology.amis.nl/blog/?p=1279

dec 20, 2007

49

Deploy to OC4J

Command-line
oc4j admin_client.jar utility
in ear project or associated with a certain
phase
mvn exec:exec -PlocalOC4J

Unfortunately no Cargo plugin


cargo:start, cargo:stop, cargo:deploy

Define local dependencies (location of


admin_client.jar) in local settings.xml

dec 20, 2007

50

Example
<profile>
<id>devOC4J</id>
<plugin>
<activation>
<groupId>org.codehaus.mojo</groupId>
<activeByDefault>false</activeByDefault>
<artifactId>exec-maven-plugin</artifactId>
</activation>
<properties>
<executions>
<ias.server.url>ci.amis.nl</ias.server.url>
<execution>
<ias.server.port>8888</ias.server.port>
<id>deployApp</id>
<ias.deploy.url>deployer:oc4j:${ias.server.url}</ias.deploy.url>
<phase>pre-integration-test</phase> <ias.username>oc4jadmin</ias.username>
<goals>
<ias.password>oc4jadmin</ias.password>
</properties>
<goal>exec</goal>
</profile>
</goals>

<configuration>
<executable>${java.home}/bin/java</executable>
<arguments>
<argument>-jar</argument>
<argument>${oc4j.adminclient.home}\j2ee\home\admin_client.jar</argument>
<argument>${ias.deploy.url}</argument>
<argument>${ias.username}</argument>
<argument>${ias.password}</argument>
<argument>-deploy</argument>
<argument>-file</argument>
<argument>../ear/target/hr1-ear-${version}.ear</argument>
<argument>-deploymentName</argument>
<argument>hr1</argument>
<argument>-bindAllWebApps</argument>
</arguments>
</configuration>
java -jar C:\server\oc4j_101310\j2ee\home\admin_client.jar
</execution>
deployer:oc4j:localhost
</executions>
oc4jadmin oc4jadmin
</plugin>
-deploy -file hr1-ear-1.0-SNAPSHOT.ear
-deploymentName hr1 -bindAllWebApps
dec 20, 2007

51

Running Maven from JDeveloper

Waiting for a JDeveloper extension ;-)


Ant tasks as wrapper

dec 20, 2007

52

Installation of Maven

http://maven.apache.org/download.html
Unzip
Environment settings : M2_HOME , PATH
mvn -verify

settings.xml
<M2_HOME>/conf/ or <user.dir>/.m2/
[local repository]
servers

credentials

internal repositories
local configurations

dec 20, 2007

oc4j installation
53

Conclusion

Continuous integration is essential for the


development process!
Using Maven, ADF Faces applications can be
continuously integrated!
Maven succesfully applied at Connexys,
Pagoni, Locatus, Nieuw Caledoni

dec 20, 2007

54

aino.andriessen@amis.nl

http://technology.amis.nl/blog

dec 20, 2007

55

Das könnte Ihnen auch gefallen