2010-10-01 7 views
0

Cela peut être plus d'un processus que d'une solution technologique. Je travaille actuellement sur un projet qui est divisé en une bibliothèque et une application de mise en œuvre. Cela a été un moyen très efficace de déboguer la bibliothèque lors de la construction de l'application. Je voudrais utiliser Maven pour les deux projets mais je ne veux pas faire une build et déployer pour chaque changement mineur. Existe-t-il un moyen pour Maven de référencer le projet en tant que référentiel?Développement de bibliothèques avec Maven

Répondre

2

Vous avez raison, c'est une question de processus. J'interprète votre question comme voulant éviter de déclarer une version spécifique de la bibliothèque en tant que dépendance dans l'implémentation. L'intention est de mettre à jour l'un ou l'autre des composants indépendamment, en particulier vous voulez pouvoir mettre à jour la bibliothèque sans avoir à reconstruire l'implémentation.

Vous devrez évidemment reconstruire et redéployer quelque chose si vous apportez une modification. Cependant, je peux voir deux étapes qui devraient répondre à vos préoccupations. Je vais appeler vos composants 'lib' et 'app'.

  1. Créer un projet "wrapper" vide, dépendant (scope = runtime) à la fois sur lib et app. Ce wrapper est ce que vous allez déployer. Lorsque vous mettez à jour la bibliothèque ou l'application, vous n'avez qu'à mettre à jour la version de cette dépendance dans le projet wrapper. Lorsque vous "build" (compile est une no-op) et tester le projet wrapper, vous confirmerez que l'ancienne/nouvelle application fonctionne toujours avec la nouvelle/ancienne lib, et vous pouvez déployer la mise à jour. Bien sûr, si vos tests échouent, vous devrez mettre à jour la dépendance de lib de l'application pour voir si une reconstruction corrige le problème, et essayer de trouver quel composant a le bug. Donc, ce n'est qu'une solution à mi-chemin, à mon avis.
  2. Mieux vaut aussi créer un composant 'lib-api', qui déclare l'interface entre lib et app. Faites en sorte que lib et ap dépendent toutes deux de lib-api, mais l'application est et non en fonction d'une version spécifique de lib. Vous pouvez toujours vouloir un projet wrapper comme ci-dessus, pour faciliter le déploiement (puisque vous aurez besoin de déployer à la fois lib et app). Mais tant que vous n'avez pas besoin d'affecter l'API de la librairie, vous pouvez être sûr que vos changements de lib ou d'application sont protégés les uns des autres et ne nécessiteront pas (ne peuvent pas) une reconstruction. Cela pourrait faciliter le suivi des bogues. Si vous avez besoin de mettre à jour lib-api, vous aurez évidemment besoin de tout reconstruire, mais ce serait vrai de toute façon et au moins de cette façon il est exposé dans la structure du projet.

J'espère que cela a du sens pour vous et j'ai correctement interprété votre question.

1

Vous pouvez avoir un "super-pom" qui a deux sous-projets. Un projet serait votre bibliothèque et l'autre projet serait votre application. Les deux peuvent être développés individuellement.

Votre application dépendrait du projet avec la bibliothèque.

Par exemple:

"super-pom": stocker ce pom.xml dans le répertoire plus haut. Vous auriez quelque chose comme ça dans ce:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>your.group</groupId> 
    <artifactId>project</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>caap</name> 
    <modules> 
     <module>project-library</module> 
     <module>project-app</module> 
    </modules> 
</project> 

Ensuite, votre pom.xml bibliothèque aurait quelque chose comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <artifactId>project</artifactId> 
     <groupId>your.group</groupId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 
    <groupId>=your.group</groupId> 
    <artifactId>project-library</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>project-library</name> 
</project> 

Et votre application aurait quelque chose comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <artifactId>project</artifactId> 
     <groupId>your.group</groupId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 
    <groupId>=your.group</groupId> 
    <artifactId>project-application</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>project-application</name> 
     <dependencies> 
       <dependency> 
      <artifactId>project-library</artifactId> 
      <groupId>your.group</groupId> 
        <version>1.0-SNAPSHOT</version> 
       </dependency> 
     </dependencies>    
</project> 
0
mvn install 

On dirait ce que je veux. Il suffit de l'exécuter depuis le projet pour l'ajouter au dépôt local et les autres applications peuvent le récupérer.

+0

Okay J'ai totalement mal interprété votre question et essayé d'y répondre entre-temps ... et je ne comprends même pas ce que vous deviez faire auparavant? Je vais laisser ma réponse mais n'hésitez pas à l'ignorer. –

+0

Je suis relativement nouveau à Maven donc l'oubli. Dans Eclipse, l'application utilisait le projet lib, en tant que dépendance, puis construisait et déployait l'application. – BobBrez

Questions connexes