Вопрос о мавене - PullRequest
       12

Вопрос о мавене

3 голосов
/ 05 февраля 2010

Я прочитал несколько полезных постов здесь на SO о предыдущих вопросах maven, в настоящее время я очень заинтересован в изучении maven (потому что мне это нравится и потому, что этого требует мой босс). В настоящее время я читаю [эту] [1] книгу и прорабатываю свои примеры. Это простая книга, но в ней есть некоторые ошибки (тривиальные), но для такого новичка, как я, может быть трудно заметить, когда его заметят, его легко исправить. Есть ли какая-нибудь другая книга, чтобы лучше понять maven сверху вниз?

Вторая часть вопроса касается примера из этой книги, возможно, простые объяснения разрешат мои сомнения.

Вот в чём дело, я сделал simple-weather проект в java, который извлекает погодные условия с погодного сервера Yahoo, учитывая конкретный почтовый индекс, который возвращает информацию о погоде.

Затем я создал «простое веб-приложение» (с maven, а также с вышеупомянутым, о котором я забыл упомянуть), которое по сути является веб-проектом, в котором уже есть некоторый сервлет по умолчанию с maven, и он ничего не делает. *

И у меня есть некоторые parent-project Я хочу объединить эти два проекта в один, поэтому я сделал pom.xml, который имеет 2 модуля, 1 для получения информации (проект Java) и другой для отображения в Интернете (веб-приложение). ).

Я заставил все работать в конце, но вот странная вещь ... если я заставлю веб-приложение отображать любую строку, «имя», скажем, построит ее независимо, она точно напечатает эту строку. Но когда я помещаю веб-приложение в «parent-project», изменяю эту строку на «name1» и собираю его как подмодуль sa partent-project ... ничего не меняется ..

Итак, я возвращаюсь к сути, потому что simple-webapp зависит от simple-weather, и я не могу больше его строить самостоятельно, поэтому теперь, если я хочу внести некоторые изменения в webapp ... измените 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. 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>

1 Ответ

4 голосов
/ 05 февраля 2010

Я не уверен, что полностью понимаю ваш вопрос. Однако давайте объясним некоторые принципы в Maven.

Итак, у вас есть такая структура:

parent
  + simple-weather
  + simple-webapp

С точки зрения Maven, у нас есть 3 проекта:

  • parent , который является проектом pom (т. Е. Его атрибут packaging установлен в pom)
  • simple-weather , который является jar проектом и имеет parent в качестве родителя.
  • simple-webapp , являющийся проектом war, имеет parent в качестве родителя и simple-weather в качестве зависимости.

Родительские проекты используют две концепции в Maven:

  • Наследование, которое говорит, что все его дети ( simple-weather и simple-webapp ) унаследуют все его свойства (эта концепция - почти то же самое, что и extends на Java).
  • Агрегация, которая определяется по определению <modules>. Агрегирование означает, что каждая команда, которая будет выполняться в проекте, будет также выполняться на каждом module.

Что произойдет, если я соберу (используя mvn clean install) каталог parent ?

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

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

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

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

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

...