Вопрос

Я прочитал несколько полезных сообщений здесь, на 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) на родитель справочник?

  1. Maven "скомпилирует" родитель проект, а затем установить the pom.xml в локальном репозитории.
  2. Maven скомпилирует простая погода проект, но поскольку у него есть родительский файл, Maven будет искать родительский файл pom.xml в локальном репозитории.Как только JAR создан, он устанавливается в локальный репозиторий.
  3. Maven, наконец, скомпилирует простой-веб-приложение проект.Maven сделает то же самое для родительского pom.xml , но также и для простая погода проект.

Ситуация, объясненная в 3-м пункте, важна:Если вы хотите построить простой-веб-приложение проект, Maven будет всегда попытайтесь найти все его зависимости , включая простая погода - из локального (или удаленного) хранилища.

Вот почему, если вы создадите только простой-веб-приложение без сборки и установки простая погода, Maven не найдет последний проект или найдет более старую версию.

Итак, подводя итог, когда вы работаете над многомодульным проектом с Maven, старайтесь всегда запускать команды сборки и установки из корневого (или родительского) каталога.

Я надеюсь, что это объяснение достаточно ясно и поможет вам понять, что происходит в вашем случае.Не стесняйтесь запрашивать дополнительную информацию...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top