Question
J'ai lu quelques messages utiles ici SO à propos des questions maven précédentes, je suis actuellement très intéressé par Maven d'apprentissage (parce que je l'aime et parce que mon patron me demande de). Je lis actuellement [ce] [1] livre et je travaille mes exemples de creux à sens unique. Son un livre simple, mais son a quelques erreurs à l'intérieur (insignifiantes), mais pour un débutant comme moi peut être difficile à repérer, une fois repéré, il peut être facilement fixé. Y at-il autre livre mieux comprendre maven de haut en bas?
Deuxième partie de la question est relative un exemple dans ce livre, peut-être une des explications simples résoudrait mes doutes.
est la chose, je fait ici un projet simple-weather
en java qui récupère les conditions météo de serveur météo Yahoo, étant donné le code particulier, il renvoie des informations météorologiques.
Alors je fait un « simple webapp » (avec Maven, ainsi que celui ci-dessus j'ai oublié de mentionner que), qui est basiquement un projet web qui a une servlet par défaut déjà avec Maven et il ne fait rien.
Et j'ai quelques parent-project
Je veux fusionner ces deux projets en un seul, donc je fait un pom.xml qui dispose de 2 modules, 1 à récupérer info (projet java) et d'autres pour l'afficher sur la (application web) web.
J'ai fait tout le travail à la fin, mais voici la chose bizarre .. si je fais webapp afficher une chaîne « nom » permet de dire ensuite construire de manière indépendante, il n'imprime exactement cette chaîne. Mais quand je mets la webapp dans le « parent-projet » et de changer cette chaîne « NAME1 » et le construire comme module sous sa-projet .. partent rien ne change ..
Je reviens donc au point, parce que simple-webapp dépend-temps simple que je ne peux pas construire plus sur lui-même, maintenant si je veux apporter quelques modifications à la webapp .. modifier le webapp en dehors du « parent-projet » bâtissent coller là alors revenir au projet parent et les modifications s'appliqueront, pourquoi est-ce, pourquoi je ne peux pas changer directement le contenu de servlet / ou ajouter un autre dans la webapp comme la partie de le "parent-projet"?
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 - VOICI POM FICHIERS POUR CHAQUE PROJET:
1. simple-parent 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>
<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>
La solution
Je ne suis pas sûr de bien comprendre votre question. Cependant, nous allons expliquer certains principes Maven.
Vous avez donc une telle structure:
parent
+ simple-weather
+ simple-webapp
Sur un point de vue Maven, nous avons 3 projets ici:
- parent , qui est un projet de
pom
(à savoir son attributpackaging
est réglé surpom
) - simple-weather , qui est un projet
jar
et a parent en tant que parent. - simple webapp , qui est un projet
war
, a parent en tant que parent et simple-weather dépendance.
Les projets parents utilisent deux concepts dans Maven:
- L'héritage, qui disent que tous ses enfants ( simple-weather et simple webapp ) héritera toutes ses propriétés (ce concept est à peu près la même chose comme
extends
en Java). - L'agrégation, qui est défini par la définition de
<modules>
. L'agrégation signifie que chaque commande qui sera exécuté sur le projet sera également exécuté sur chaquemodule
.
Qu'arrive t-il si je construis (en utilisant mvn clean install
) sur la parent
- Maven "compilation" parent projet, puis install pom.xml dans le référentiel local.
- Maven compiler le projet simple-weather , mais comme il a un parent, Maven regardera le fichier pom.xml parent dans le dépôt local. Une fois que le JAR est créé, il est installé dans le référentiel local.
- Maven va enfin compiler le simple webapp projet. Maven fera la même chose pour la pom.xml mère, mais aussi pour le simple-weather projet.
La situtation expliqué dans le 3ème point est important: Si vous voulez construire la simple webapp projet, Maven toujours essayer de trouver toutes ses dépendances - y compris simple-weather -. du dépôt local (ou distant)
Voilà pourquoi si vous construisez seulement le simple webapp sans la construction et l'installation de simple-weather , Maven ne trouvera pas le dernier projet, ou trouvera une version plus ancienne.
Donc, pour résumer, lorsque vous travaillez sur le projet multi-modules avec Maven, essayez d'exécuter toujours la construction et l'installation des commandes à partir du répertoire racine (ou parent).
J'espère que cette explication est assez claire et vous aider à comprendre ce qui se passe dans votre cas. Ne pas hésiter à demander plus d'informations ...