Вопрос
Я прочитал несколько полезных сообщений здесь, на SO, о предыдущих вопросах maven, в настоящее время я очень заинтересован в изучении maven (потому что мне это нравится и потому что мой босс требует от меня этого).В настоящее время я читаю [эту] [1] книгу и работаю над примерами.Это простая книга, но в ней есть некоторые ошибки (тривиальные), но для новичка вроде меня их может быть трудно обнаружить, после того как они будут обнаружены, их можно легко исправить.Есть ли какая-нибудь другая книга, которая лучше подходит для понимания maven сверху донизу?
Вторая часть вопроса связана с примером из этой книги, возможно, простые объяснения разрешили бы мои сомнения.
Вот в чем дело, я сделал simple-weather
проект на java, который извлекает погодные условия с сервера yahoo weather server с учетом конкретного почтового индекса, который возвращает информацию о погоде.
Затем я создал 'simple-webapp' (с maven, а также с тем, что указано выше, я забыл упомянуть об этом), который в основном представляет собой веб-проект, в котором уже есть некоторый сервлет по умолчанию с maven, и он ничего не делает.
И у меня есть немного parent-project
Я хочу объединить эти два проекта в один, поэтому я создал pom.xml в котором есть 2 модуля: 1 для извлечения информации (java project) и другой для отображения ее в Интернете (web app).
В конце концов я заставил все работать, но вот что странно ..если я заставлю webapp отображать любую строку "name", допустим, а затем создам ее независимо, она точно напечатает эту строку.Но когда я помещаю веб-приложение в "родительский проект" и изменяю эту строку на "name1" и создаю ее как вспомогательный модуль sa partent-project..ничего не меняется ..
Итак, я возвращаюсь к сути, поскольку simple-webapp зависит от simple-weather, я больше не могу создавать его самостоятельно, так что теперь, если я хочу внести некоторые изменения в webapp..измените веб-приложение вне "родительского проекта", создайте его там, затем вставьте обратно в родительский проект, и тогда изменения будут применены, почему это так, почему я не могу напрямую изменить содержимое сервлета / или добавить другое в веб-приложение как часть "родительского проекта"?
Спасибо..Я знаю, что это длинный и скучный вопрос, но я просто пытаюсь чему-то научиться, и нет лучшего места для вопроса, чем здесь: D
РЕДАКТИРОВАТЬ - ВОТ POM-ФАЙЛЫ ДЛЯ КАЖДОГО ПРОЕКТА :
1.простой родитель 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
<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.простой-веб-приложение 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>
Решение
Я не уверен, что полностью понимаю ваш вопрос.Однако давайте объясним некоторые принципы в Maven.
Итак, у вас есть такая структура:
parent
+ simple-weather
+ simple-webapp
С точки зрения Maven, у нас здесь есть 3 проекта:
- родитель, который является
pom
проект (т.е.егоpackaging
атрибут установлен вpom
) - простая погода, который является
jar
проект и имеет родитель как родитель. - простой-веб-приложение, который является
war
проект, имеющий родитель как родитель и простая погода как зависимость.
Родительские проекты используют две концепции в Maven:
- Наследство, в котором говорится, что все его дети (простая погода и простой-веб-приложение) унаследует все его свойства (это понятие почти то же самое, что
extends
на Java). - Агрегирование, которое определяется определением
<modules>
.Агрегирование означает, что каждая команда, которая будет выполняться в проекте, также будет выполняться в каждомmodule
.
Что произойдет, если я создам (используя mvn clean install
) на родитель справочник?
- Maven "скомпилирует" родитель проект, а затем установить the pom.xml в локальном репозитории.
- Maven скомпилирует простая погода проект, но поскольку у него есть родительский файл, Maven будет искать родительский файл pom.xml в локальном репозитории.Как только JAR создан, он устанавливается в локальный репозиторий.
- Maven, наконец, скомпилирует простой-веб-приложение проект.Maven сделает то же самое для родительского pom.xml , но также и для простая погода проект.
Ситуация, объясненная в 3-м пункте, важна:Если вы хотите построить простой-веб-приложение проект, Maven будет всегда попытайтесь найти все его зависимости , включая простая погода - из локального (или удаленного) хранилища.
Вот почему, если вы создадите только простой-веб-приложение без сборки и установки простая погода, Maven не найдет последний проект или найдет более старую версию.
Итак, подводя итог, когда вы работаете над многомодульным проектом с Maven, старайтесь всегда запускать команды сборки и установки из корневого (или родительского) каталога.
Я надеюсь, что это объяснение достаточно ясно и поможет вам понять, что происходит в вашем случае.Не стесняйтесь запрашивать дополнительную информацию...