2010-02-05 5 views
3

J'ai lu quelques messages utiles ici sur SO sur les questions précédentes de maven, je suis actuellement très intéressé par l'apprentissage de maven (parce que je l'aime et parce que mon patron me le demande). Je suis en train de lire [ce] [1] livre et je travaille mon chemin à travers des exemples. C'est un livre simple, mais il a quelques erreurs à l'intérieur (trivial), mais pour un débutant comme moi peut être difficile à repérer, une fois repéré, il peut être facilement réparé. Y a-t-il un autre livre pour mieux comprendre maven de haut en bas?Question sur maven

La deuxième partie de la question est de relier un exemple dans ce livre, peut-être qu'une explication simple permettrait de résoudre mes doutes.

Voici la chose, j'ai fait un projet simple-weather en Java qui récupère les conditions météorologiques du serveur météo yahoo, étant donné le code postal particulier, il renvoie des informations météorologiques.

Puis j'ai fait un 'simple-webapp' (avec maven ainsi que celui ci-dessus j'ai oublié de le mentionner), qui est essentiellement un projet web qui a déjà une servlet par défaut avec maven et qui ne fait rien. Je veux fusionner ces deux projets en un, j'ai donc fait un pom.xml qui a 2 modules, 1 pour récupérer des informations (projet java) et d'autres pour les afficher sur le web (application web) .

J'ai fait tout fonctionner à la fin, mais voici la chose étrange .. si je fais afficher webapp une chaîne "nom" laisse dire puis le construire indépendamment, il imprime exactement cette chaîne. Mais quand je mets la webapp dans le "parent-project" et change cette chaîne en "name1" et la construis comme sous-module de projet partent .. rien ne change ..

Donc je reviens au point, parce que simple-webapp dépend du temps simple Je ne peux plus le construire seul, alors maintenant si je veux faire des changements à la webapp .. modifier la webapp en dehors du "parent-projet" la construire là puis la coller au projet parent, puis les modifications s'appliqueront, pourquoi est-ce, pourquoi ne puis-je pas directement modifier le contenu du servlet/ou en ajouter un autre dans la webapp dans le cadre du "projet-parent"?

Merci .. Je sais que une question à long et ennuyeux, mais je suis juste essayer d'apprendre des choses et il n'y a pas de meilleur endroit pour demander que ici: D

EDIT - SONT ICI POM FICHIERS CHAQUE PROJET:

1. pom.xml simple-parent

<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>org.sonatype.mavenbook.multi</groupId> 
    <artifactId>simple-parent</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0</version> 
    <name>Multi Chapter Simple Parent Project</name> 
<modules> 
<module>simple-weather</module> 
<module>simple-webapp</module> 
</modules> 
<build> 
<pluginManagement> 
<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> 
</pluginManagement> 
</build> 
<dependencies> 
<dependency> 
<groupId>junit</groupId> 
<artifactId>junit</artifactId> 
<version>3.8.1</version> 
<scope>test</scope> 
</dependency> 
</dependencies> 
</project> 

2. pom.xml simple-weather

<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> 
<parent> 
<groupId>org.sonatype.mavenbook.multi</groupId> 
<artifactId>simple-parent</artifactId> 
<version>1.0</version> 
</parent> 
<artifactId>simple-weather</artifactId> 
<packaging>jar</packaging> 
<name>Multi Chapter Simple Weather API</name> 
<build> 
<pluginManagement> 
<plugins> 
<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-surefire-plugin</artifactId> 
<configuration> 
<testFailureIgnore>true</testFailureIgnore> 
</configuration> 
</plugin> 
</plugins> 
</pluginManagement> 
</build> 
<dependencies> 
<dependency> 
<groupId>log4j</groupId> 
<artifactId>log4j</artifactId> 
<version>1.2.14</version> 
</dependency> 
<dependency> 
<groupId>dom4j</groupId> 
<artifactId>dom4j</artifactId> 
<version>1.6.1</version> 
</dependency> 
<dependency> 
<groupId>jaxen</groupId> 
<artifactId>jaxen</artifactId> 
<version>1.1.1</version> 
</dependency> 
<dependency> 
<groupId>velocity</groupId> 
<artifactId>velocity</artifactId> 
<version>1.5</version> 
</dependency> 
<dependency> 
<groupId>org.apache.commons</groupId> 
<artifactId>commons-io</artifactId> 
<version>1.3.2</version> 
<scope>test</scope> 
</dependency> 
</dependencies> 
</project> 

3. simple webapp pom.xml

<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> 
<parent> 
<groupId>org.sonatype.mavenbook.multi</groupId> 
<artifactId>simple-parent</artifactId> 
<version>1.0</version> 
</parent> 
<artifactId>simple-webapp</artifactId> 
<packaging>war</packaging> 
<name>simple-webapp Maven Webapp</name> 
<dependencies> 
<dependency> 
<groupId>javax.servlet</groupId> 
<artifactId>servlet-api</artifactId> 
<version>2.4</version> 
<scope>provided</scope> 
</dependency> 
<dependency> 
<groupId>org.sonatype.mavenbook.multi</groupId> 
<artifactId>simple-weather</artifactId> 
<version>1.0</version> 
</dependency> 
</dependencies> 
<build> 
<finalName>simple-webapp</finalName> 
<plugins> 
<plugin> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>maven-jetty-plugin</artifactId> 
</plugin> 
</plugins> 
</build> 
</project> 
+0

S'il vous plaît expliquer quel but vous exécutez et d'où. –

+0

Je cours, maven propre puis maven installer à partir du parent pom.xml –

Répondre

4

Je ne suis pas sûr de bien comprendre votre question. Cependant, expliquons quelques principes dans Maven.

Vous avez une telle structure:

parent 
    + simple-weather 
    + simple-webapp 

Sur un point de vue Maven, nous avons 3 projets ici:

  • parents, qui est un projet pom (sa packaging l'attribut est défini sur pom)
  • simple-météo, qui est unProjetet a parent comme parent.
  • simple webapp, qui est un projet war, a parent comme parent et simple temps comme la dépendance.

Les projets parents utilise deux concepts Maven:

  • L'héritage, qui dit que tous ses enfants (simple temps et simple webapp) héritera toutes ses propriétés (Ce concept est presque la même chose que le extends en Java).
  • L'agrégation, qui est définie par la définition de <modules>. L'agrégation signifie que chaque commande qui sera exécutée sur le projet sera également exécutée sur chaque module.

Que passerait-il si je construis (en utilisant mvn clean install) sur le répertoire parent ?

  1. Maven "compiler" le projet parent puis installer le pom.xml dans le référentiel local. Maven compilera le projet par temps simple, mais comme il a un parent, Maven recherchera le fichier pom.xml parent dans le référentiel local. Une fois le fichier JAR créé, il est installé dans le référentiel local. Maven va enfin compiler le projet simple-webapp. Maven fera la même chose pour le pom.xml parent, mais aussi pour le projet simple-weather.

La situtation expliqué dans le 3ème point est important: Si vous voulez construire le projet simple-webapp, Maven toujours essayer de trouver toutes ses dépendances - y compris simple-weather - de le référentiel local (ou distant).

Voilà pourquoi si vous construisez seulement le simple webapp sans construction et l'installation simple temps, Maven ne trouvera pas le dernier projet, ou trouvera une version plus ancienne.Pour résumer, lorsque vous travaillez sur un projet multi-modules avec Maven, essayez de toujours exécuter les commandes build et install du répertoire racine (ou parent).

J'espère que cette explication est assez claire et vous aidera à comprendre ce qui se passe dans votre cas. Ne hésitez pas à demander plus d'informations ...

+0

Merci pour votre explication, cela m'a aidé à clarifier certaines choses pour moi, mais je n'ai pas tout à fait obtenir la réponse à ma question. Voici la chose, si je ne veux rien changer à l'intérieur de webapp, disons au lieu d'imprimer "voici les conditions météorologiques pour 01201" Je veux imprimer "les conditions météorologiques actuelles pour 01201 sont" et je le construis à partir de pom.xml principal de Bien sûr, rien ne change ... l'ancien message s'imprime, cependant si je prends webapp en dehors du parent, changez-le sans rien construire en le recollant au parent, en le reconstruisant seulement alors je vais mettre les changements à jour. –

+0

@romaintaz Dois-je partager un projet/code? Parce que je suis maintenant assez sûr de savoir comment Maven fonctionne et cela ne devrait pas arriver. Merci –

+0

Que voulez-vous dire par "si je prends webapp * en dehors du parent"? Vous voulez dire que vous supprimez la webapp de la liste '' du parent? Peut-être que vous pouvez éditer votre question et nous montrer vos fichiers pom.xml ... – romaintaz