Activité récente sur le site

FAQs‎ > ‎

Maven2

Maven 2
--------------

1- installation de maven (dézipper) -> C:\Program Files\maven
2- changement de C:\Program Files\maven\conf\settings.xml pour configurer le repository local -> d:\repository
  => configuration pour l'ensemble des projets
3- création d'un artefact (projet java) par :
  mvn archetype:create -DgroupId=topad2.fr.impots.gouv -DartifactId=Service
  pour une appli web :
  mvn archetype:create -DgroupId=topad2.fr.impots.gouv -DartifactId=Service -DarchetypeArtifactId=maven-archetype-webapp
    => crée un répertoire webapp et un fichier web.xml

Attention : pas besoin de créer un répertoire, il crée lui-même un répertoire Service. 
Facile de faire des projets multi-modules. 
Commencer par le répertoire père (exemple commun), en le définissant de type pom. 
Puis en entrant dans ce répertoire, créer les différents modules fils, ils seront automatiquement rajoutés comme modules fils de commun. 

mvn eclipse:eclipse sur commun, ajoutera automatiquement la conf eclipse à tous les modules fils. 
 
 Remarque : 1 artefact par couche (par projet eclipse)
4- créer un projet eclipse à partir de l'artefact -> mvn eclipse:eclipse
5- modifier dans eclipse > windows préférences > Maven installation > User settings (y mettre le fichier settings.xml du poste)

6- ajout dans pom.xml le fait de compiler en jdk1.5 (si on utilise les annotations p. ex.)
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
   
7- pour les test, on peut avoir besoin de modifier le plugin surefire pour inclure des fichiers qui ne se terminent pas par Test.
Ajout dans le pom.xml de :
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>false</skip>
                    <testFailureIgnore>true</testFailureIgnore>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>
   
8- gérer les conflits en passant par le diagramme des graphes de dépendance ou de hierarchie du plugin Eclipse
Ex : on ne veut pas qu'Hibernate ramène sa dépendance de commons-logging

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>3.2.5.ga</version>
      <scope>compile</scope>
      <exclusions>
          <!--  dépendance gérée par spring -->
          <exclusion>
              <groupId>commons-logging</groupId>
              <artifactId>commons-logging</artifactId>
          </exclusion>
      </exclusions>
     </dependency>
    
9- si l'on a plusieurs artefacts (ex : a dépend de b qui dépend de c), il faut faire mvn install sur c, puis sur b, avant de pouvoir compiler a.

10 - modifier pom pour spécifier le repository distant où stocker les artefacts

    <distributionManagement>
        <repository>
            <id>springsource-repository</id>
            <name>SpringSource Repository</name>
            <url>file://C:/cours-maven/remote-repository/release</url>
        </repository>
        <snapshotrepository> <!-- si gestion différentes snapshots & releases -->
            <id>snap-springsource-repository</id>
            <name>snap-SpringSource Repository</name>
            <url>file://C:/cours-maven/remote-repository/snapshot</url>
        </snapshotrepository>
    </distributionManagement>

11- si manque de mémoire (p. ex. pour lancer PMD)
set MAVEN_OPTS=-Xmx256m en DOS (ou en variable système?)

Vocabulaire : 
------------------

Faire la différence entre l'héritage de projet (module parent/fils) et les sous-module. 
Dans le 1er cas, on veut factoriser des propriétés. 
Dans le 2ème cas, on veut que l'appel d'un goal sur un module se lance sur ses sous-modules. 

Utilitaires :
------------

- mvn {nom-plugin}:{nom-goal}

- mvn help:effective-pom => liste l'ensemble du pom hérité et explicite du projet courant

- mvn help:effective-settings => liste la configuration du fichier settings.xml

- mvn help:describe -Dplugin=help => décrit l'aide du plugin help

- mvn help:describe -Dplugin=help -Dgoal=describe => affichage de l'aide du goal describe du plugin help

- mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-surefire-plugin


ANNEXES
-------

A - Eclipse
Dans eclipse, pour avoir un projet java avec le classpath géré par Maven :

dans .project :
    <natures>
    <nature>org.eclipse.jdt.core.javanature</nature>   
        <nature>org.maven.ide.eclipse.maven2Nature</nature>
    </natures>

dans .classpath :
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java"/>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>   


B - propriétés dans pom
    <properties>
        <spring.version>2.5.6</spring.version>
    </properties>
    ...
    <version>${spring.version}</version>
   
C - héritage de propriétés dans un pom père

pom père :
  <groupId>com.springsource.applications</groupId>
  <artifactId>abstractProject</artifactId>
  <packaging>pom</packaging> <!-- => spécifie que c'est un pom "abstrait" -->
  <dependencies>
  ...
 
pom fils :
    <parent>
          <groupId>com.springsource.applications</groupId>
          <artifactId>abstractProject</artifactId>
          <version>1.0-SNAPSHOT</version>
    </parent> 
 
puis ajouter des dépendances dans le pom père (et commun à tous les fils) :
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

ou bien ajouter des dépendances optionnelles dans le pom père :
  <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
  </dependencyManagement>
 
dans ce cas, le fils n'a qu'à rajouter ceci s'il utilise la dépendance :
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
        </dependency>
      </dependencies>

ou gestion multi-modules :
dans pom père :
  <modules>
      <module>rewardsWeb</module>
  </modules>
 
  il faut qu'il y ait un répertoires sous le répertoire père, avec le nom rewardsWeb et géré par Maven
 
D- Exemple configuration Checkstyle
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <configLocation>src/main/resources/rewards-checkstyle.xml</configLocation>
                </configuration>               
            </plugin>

E- Exemple configuration PMD
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <linkXref>true</linkXref>
                    <targetJdk>1.6</targetJdk>
                </configuration>               
            </plugin>