Pascalleclercq's Blog

13/05/2010

Customisation des plugins « Tycho »

Filed under: Eclipse RCP,Maven,OSGi,Tycho — pascalleclercq @ 9:56

Récemment Keukeul m »interrogeait sur la documentation des plugins « Tycho » (https://pascalleclercq.wordpress.com/2010/02/14/construire-ses-plugins-eclipse-rcp-avec-maven-c%e2%80%99est-plus-facile-maintenant-avec-maven-3-et-tycho/#comment-9).

Rappelons que Tycho peut être défini comme un ensemble de plugins maven destiné à la construction de livrables eclipse. La question posée par Keukeul est pour le moins légitime et pertinente !

Malheureusement, à ce jour, je ne connais pas d’article de référence concernant la configuration de ces plugins. La seule vraie solution aujourd’hui est de récupérer les exemples disponibles avec les sources de Tycho. (http://github.com/sonatype/sonatype-tycho/tree/master/tycho-its/projects/)

Je vais donc, à la demande générale exposer les différentes configuration des plugins Tycho que j’ai eu l’occasion d’utiliser en tentant d’expliquer le pourquoi.

1. tycho-maven-plugin

La présence de ce plugin est indispensable pour que maven sache interpréter les packaging Tycho (http://tycho.sonatype.org/packagingtypes.html). Un bloc de ce type est donc indispensable :

<build>
<plugin>
   <groupId>org.sonatype.tycho</groupId>
   <artifactId>tycho-maven-plugin</artifactId>
   <version>0.8.0</version>
   <extensions>true</extensions>
</plugin>
...
</build>

Je n’ai pas grand chose à dire de plus mis à part que ce bloc est indispensable pour que Tycho puisse fonctionner. Ce bloc est bien entendu à placer dans votre pom.xml « parent ».

2. maven-osgi-compiler-plugin

Ce plugin est ni plus ni moins l’équivalent du fameux « maven-compiler-plugin ». Il me sert à configurer l’équivalent du « -source » et « -target » du compilateur java.

<build>
     <plugins>
       <plugin>
         <groupId>org.sonatype.tycho</groupId>
         <artifactId>maven-osgi-compiler-plugin</artifactId>
         <version>0.8.0</version>
         <configuration>
           <source>1.6</source>
           <target>1.6</target>
         </configuration>
       
       </plugin>
     </plugins>
 </build>

Je n’ai pas testé autre chose sur ce plugin mais je pense qu’on peux raisonnablement espérer que l’essentiel voire la totalité des options du classique maven-compiler-plugin fonctionne (http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html)

3. target-platform-configuration

A mes yeux le plugin le plus utile à connaître. En effet, tycho fonctionne par défaut avec un repository de type « file system » à plat que l’on passe en argument du build -Dtycho.targetPlatform=c:/eclipse.

Ce que l’on veut, c’est que Tycho puisse exploiter des repository à la maven voire mieux à la p2 (tant qu’à faire de l’eclipse…). Eh bien Tycho peut faire les 2 !!!!

Comment simplement en ajoutant dans votre pom.xml ce bloc :

<build>
		<plugins>
		...
			<plugin>
				<groupId>org.sonatype.tycho</groupId>
				<artifactId>target-platform-configuration</artifactId>
				<version>0.8.0</version>
				<configuration>
					<resolver>p2</resolver>
					<pomDependencies>consider</pomDependencies>
				</configuration>
			</plugin>
		</plugins>
</build>

<repositories>
		<repository>
			<id>gallileo</id>
			<layout>p2</layout>
			<url>http://download.eclipse.org/releases/galileo</url>
		</repository>

...
</repositories>

Explications :
– la balise p2 permet de dire à maven de prendre en considération lors du build les dépendances trouvées dans le dépôt p2 positionné quelques lignes plus bas sous la balise « repositories ».
– la balise consider permet d’exploiter en même temps des dépendances provenant de repository au layout maven (c’est le cas de Spring DM par exemple). Il va sans dire que ces dépendances doivent être des bundles OSGi pour être exploitables lors du build. Si vous n’avez pas besoin de dépendance provenant d’un dépôt maven cette balise ne vous sera pas utile.

4. maven-osgi-packaging-plugin

Ce packaging est utile pour la construction de « product » (= d’exécutables) eclipse. Pour rappel, pour contruire un « product » avec Tycho vous devez créer un projet séparé ne contenant u’un fichier « .product » et dont le pom.xml possède le packaging « eclipse-application ».

<plugin>
                <groupId>org.codehaus.tycho</groupId>
                <artifactId>maven-osgi-packaging-plugin</artifactId>
                <version>0.8.0</version>
                <configuration>
                <productConfigurationFile>toto.product</productConfigurationFile>
                    <environments>
                        <environment>
                            <os>linux</os>
                            <ws>gtk</ws>
                            <arch>x86</arch>
                        </environment>
                        <environment>
                            <os>win32</os>
                            <ws>win32</ws>
                            <arch>x86</arch>
                        </environment>
                        </environments>
                </configuration>
</plugin>

Remarque : Une best practice consiste à « variabiliser » le numéro de version de Tycho (0.8.0 ici) dans un propriété du pom.xml.

Un exemple de contruction d’un projet mutimodule avec tycho : http://code.google.com/p/dynaresume/source/checkout

Publicités

05/05/2010

Accédez à des Entités en remoting malgré Hibernate

Filed under: Hibernate,Spring — pascalleclercq @ 9:39

Si vous utilisez hibernate vous savez sans nul doute qu’il est founit mécanisme de Proxy afin de gérer le fameux « lazy loading ».

Les Proxy hibernate nous sont donc bien utiles dans un grand nombre de cas mais si vous souhaitez exposer vos Entités en remoting, alors ces Proxy deviennent subitement bien encombrants.

Comment ?

La problématique n’est pas nouvelle et des Frameworks tels que BeanLib sont apparus pour résoudre cette problématique. A la demande générale je vais présenter l’approche retenue dans le projet DynaRésumé.

Quand ?

A mes yeux, le meilleur moment pour dé-proxyfier vos entités hibernate c’est le moment où vos beans s’apprêtent à quitter la VM. En effet, couper les entités de la session hibernate trop tôt peut se réveler particulièrement contre productif.
Si vous avez la chance d’utiliser Spring  (je ne connais aucune bonne raison de ne pas l’utiliser) la réponse tient en une petite classe Java et un peu de XML.

D’abord il nous faut créer un « Interceptor » qui va nous permettre d’ajouter du comportement aux appels remoting de manière non-intrusive.

import net.sf.beanlib.hibernate.HibernateBeanReplicator;
import net.sf.beanlib.hibernate3.Hibernate3BeanReplicator;
import net.sf.beanlib.hibernate3.LazyHibernateCustomBeanTransformer;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class EntityCleanerInterceptor implements MethodInterceptor {

	private final HibernateBeanReplicator replicator = new Hibernate3BeanReplicator()
			.initCustomTransformerFactory(new LazyHibernateCustomBeanTransformer.Factory());;

	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object fromBean = invocation.proceed();

		Object toBean = replicator.copy(fromBean);

		return toBean;
	}
}

Puis, nous allons brancher notre Interceptor à notre « Service Exporter« , ici un « HttpInvokerServiceExporter ».

	<bean id="entityCleanerInterceptor "
		class="org.dynaresume.springremoting.EntityCleanerInterceptor " />

<bean name="/MyRemoteService"
		class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
		<property name="service" ref="myService" />
		<property name="serviceInterface" value="org.dynaresume.core.service.MyService" />
		<property name="interceptors">
			<list>
				<ref bean="entityCleanerInterceptor " />
			</list>
		</property>
	</bean>

Et voilà !!!! Avouez que l’on peut difficilement faire plus simple.

A noter qu’au sein du projet DynaResume, nous avons eu l’occasion de mettre en oeuvre cette technique dans un contexte OSGi sans effort particulier en dehors de la « bundle-ization » des jars « BeanLib ».

A ce jour, je n’ai pas enore eu l’occasion de tester Gilead mais si un lecteur a des retours ou est tenté par l’expérience je suis preneur d’informations : Les commentaires sont toujours le bienvenus.

Créez un site Web ou un blog gratuitement sur WordPress.com.