Maven2

Débugguer maven

Dans $MAVEN_HOME/bin, ajouter un fichier mvn-debug

#!/bin/sh
echo ""
echo Debug mode on port 8000
echo ""

   

export MAVEN_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"

    . `dirname "$0"`/mvn

exec "`dirname "$0"`/mvn" $QUOTED_ARGS

 

unset MAVEN_OPTS

Rendre le bordel exécutable

$ chmod +x $MAVEN_HOME/bin/mvn-debug

Démarrer maven en mode debug

$ mvn-debug <target>

Debug mode on port 8000

Le processus attendra la connexion d'un débuggeur avant de poursuivre.

Construire un projet Workshop 8.1 avec Maven 2

Suite de mes expérimentations avec Workshop 8.1 ...

Pour une raison ou pour une autre, vous souhaitez builder votre projet Workshop 8.1 avec Maven 2... Vous avez interrogé tous vos collègues, effectué pas mal de recherches sur le net pour trouver comment faire cohabiter ces deux-là, mais vous n'avez pas trouvé de solution... Je vous en propose une, alors bien sûr, elle vaut ce qu'elle vaut mais elle a au moins le mérite de marcher ;)

Workshop permet d'exporter dans un fichier XML les goals Ant qu'il lance pour construire un projet. Pour ce faire, naviguez dans le menu Tools, choisissez Project properties puis sélectionnez votre projet. Une popup apparaît. Dans l'arborescence de gauche, cliquez sur l'item Build. Dans le volet de droite, dans la section Build Type, tout en haut, cliquez sur le bouton Export to Ant file. Un fichier exported_build.xml est créé dans le répertoire du projet. Naviguez jusqu'à ce répertoire, ouvrez le fichier, sélectionnez son contenu en excluant la balise racine et copiez la sélection.

A présent, dans votre fichier pom.xml, rajoutez le code suivant:

	<!-- ... -->
	<build>
		<!-- ... -->
		<plugins>
			<!-- ... -->
			<plugin>
				<artifactId>maven-antrun-plugin</artifactId>
				<executions>
					<execution>
						<phase>compile</phase>
						<configuration>
							<tasks>
							</tasks>
						</configuration>
						<goals>
							<goal>run</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!-- ... -->
		</plugins>
		<!-- ... -->
	</build>
	<!-- ... -->

A l'intérieur de la balise , collez le contenu de exported_build.xml que vous avez copié auparavant. Dans la balise , indiquez après quel goal Maven sera exécuté le code Ant.

Vous pouvez maintenant lancer votre build Maven qui construira votre projet Workshop !

Maven 2 et driver JDBC

Si vous développez une application que vous gérez avec Maven 2 et que votre couche d'accès aux données est codée en JDBC, vous souhaiteriez peut-être avoir votre driver de base de données en tant que dépendance dans votre descripteur de projet pom.xml.

Pour ce faire, ouvrez une ligne de commande et exécutez l'instruction suivante:

$ mvn install:install-file -Dfile=<driver_file_path> -DgroupId=<database_provider> -DartifactId=<artifact_name> -Dversion=<driver_version> -Dpackaging=jar

Par exemple, pour Oracle cela donnerait:

$ mvn install:install-file -Dfile=~/oracle.jar -DgroupId=oracle -DartifactId=ojdbc -Dversion=9.0.2.0.0 -Dpackaging=jar

Cette commande va copier le JAR du driver dans votre repository Maven local, en utilisant l'arborescence classique:

~/.m2/repository
|___oracle
    |___ojdbc
        |___9.0.2.0.0

Dans votre fichier pom.xml, vous rajouterez ainsi le bloc suivant:

<!-- ... -->
<dependencies>
	<dependency>
		<groupId>oracle</groupId>
		<artifactId>ojdbc</artifactId>
		<version>9.0.2.0.0</version>
	</dependency>
</dependencies>
<!-- ... -->

Quand vous lancerez un goal sur votre projet, Maven essaiera de récupérer le fichier pom.xml du driver sur son repository distant, et ne le trouvera probablement pas, si bien sûr ce driver n'existe pas en tant que dépendance "officielle" de Maven, ce qui est le cas du driver Oracle. Cependant, ne vous inquiétez pas, ceci n'est pas bloquant, et vos goals s'exécuteront normalement.

Edit: Cette commande fonctionne bien sûr pour n'importe quelle librairie qui n'existe pas dans les repositories de Maven et que vous auriez récupérée vous-même.

Taskmanager

Voici la page de l'application TaskManager. Il s'agit simplement d'une application que j'ai crée dans le but de découvrir certains aspects du développement Web comme le framework Tapestry.

L'application peut être construite via Maven2. Elle va usage important des annotations Java5 ainsi que des generics. Au menu du Spring, de l'Hibernate, un peu d'AOP, etc...

Les sources peuvent être téléchargé via le lien suivant : http://anothergeekwebsite.com/files/task(..)

Maven2, XDoclet2, Hibernate, enfin!

Aprés avoir pas mal galéré pour faire générer mon mapping Hibernate depuis XDoclet2, lui même lancé via Maven2, j'ai enfin réussi à avoir une configuration qui me convient.

Pour avoir tout le bazar fonctionnel, il faut d'abord réussir à intégrer XDoclet2 et Maven2. Et vu le statut encore trés "développement" du plugin XDoclet2, ça n'a pas été évident de trouver la bonne configuration. Au final voilà ma configuration fonctionnelle :

<build>
    <plugins>
      <plugin>
        <groupId>xdoclet</groupId>
        <artifactId>maven2-xdoclet2-plugin</artifactId>
        <version>2.0.5-SNAPSHOT</version>
        <executions>
          <execution>
            <goals>
              <goal>xdoclet</goal>
            </goals>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>xdoclet-plugins</groupId>
            <artifactId>xdoclet-plugin-hibernate</artifactId>
            <version>1.0.4-SNAPSHOT</version>
          </dependency>
          <dependency>
            <groupId>xdoclet-plugins</groupId>
            <artifactId>xdoclet-plugin-hibernate</artifactId>
            <version>1.0.4-SNAPSHOT</version>
          </dependency>
        </dependencies>
        <configuration>
          <configs>
            <config>
              <plugin>org.xdoclet.plugin.hibernate.HibernateMappingPlugin</plugin>
              <params>
                <version>3.0</version>
                <destdir>${basedir}/target/classes/</destdir>
              </params>
            </config>
            <config>
              <plugin>org.xdoclet.plugin.hibernate.HibernateConfigPlugin</plugin>
              <params>
                <dialect>org.hibernate.dialect.HSQLDialect</dialect>
                <jdbcdriver>org.hsqldb.jdbcDriver</jdbcdriver>
                <jdbcurl>jdbc:hsqldb:mem:taskmanager</jdbcurl>
                <jdbcusername>sa</jdbcusername>
                <jdbcpassword></jdbcpassword>
                <hbm2ddlauto>create</hbm2ddlauto>
                <showsql>true</showsql>
                <version>3.0</version>
              </params>
            </config>
          </configs>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <pluginRepositories>
    <pluginRepository>
      <releases />
      <snapshots />
      <id>codehaus-plugins-legacy</id>
      <url>http://dist.codehaus.org/</url>
      <layout>legacy</layout>
    </pluginRepository>
    <pluginRepository>
      <releases />
      <snapshots />
      <id>codehaus-plugins</id>
      <url>http://dist.codehaus.org/</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
    </dependency>
    <dependency>
      <groupId>hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>3.0.5</version>
    </dependency>

Il est important de remarquer plusieurs choses :

  • On utilise la version 1.0.4-SNAPSHOT du plugin
  • On est dans l'obligation d'ajouter 2 dépôts supplémentaires donc l'un doit être au format legacy (ceci parce que le dépôt des plugins xdoclet n'a pas encore migrer vers Maven2)

Cependant chez moi la génération de la configuration Hibernate était d'une lenteur incroyable - dans les 40s. Bien que je n'explique pas trop le pourquoi, je suis donc partie à la recherche d'une solution plus viable. Et Spring est venu à moi.

En effet, étant donnée que la configuration Hibernate en elle même risque peu de changer, je l'ai directement inséré dans mon applicationContext-hibernate.xml. Le plugin XDoclet2 pour Maven2 s'occupant dorénavant que de la génération des fichiers mappings (*.hbm.xml), l'ensemble est plus rapide.