Я превращаю один проект веб-приложения, управляемый Eclipse Maven, в многомодульный проект Maven (это тестовый проект для экспериментов с Maven, поэтому не стесняйтесь вносить любые предложения).
Веб-приложение с одним проектом не имеет ошибок, успешно компилируется и ведет себя правильно при развертывании, поэтому я начинаю с рабочего приложения.
Приложение имеет веб-часть и консольную часть, а это означает, что есть некоторые классы с методом main()
, которые при запуске из Eclipse (с запуском от имени -> приложение Java) работают должным образом. Обе части показывают данные из базы данных, запрашиваемые либо напрямую через JDBC, либо через jOOQ.
Итак, вот как я разделил проект:
- ядро (содержит все общее с двумя другими частями);
- runnable (содержит классы, имеющие метод
main()
); - webapp (часть веб-приложения).
Внутри Eclipse у меня сейчас 4 отдельных проекта:
shaker-multi
содержит агрегатор (и родительский) POM, а также каждый модуль в подкаталоге;shaker-multi-core
;shaker-multi-runnable
;shaker-multi-webapp
.
Внутри Eclipse компилируются core и webapp, и последнее можно развернуть на экземпляре Tomcat, и я вижу его в браузере.
Проблема возникает с runnable. Этот проект основан на классах jOOQ, поэтому необходимо сгенерировать соответствующий исходный код. Зависимости и конфигурация jOOQ находятся в core/pom.xml
(поскольку они могут использоваться и там).
Когда я делаю Project -> Run As -> Maven build... -> clean generate-sources
, на shaker-multi-core
я получаю:
Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1
что звучит разумно, поскольку я не устанавливал ни одного из этих артефактов даже в своем локальном репозитории.
Но когда я вызываю Maven build... -> 'чистая установка' на shaker-multi
, он ломается, потому что не может найти файл web.xml
для shaker-multi-webapp
(хотя он правильно находится в shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml
).
Что я должен делать? Является ли конфигурация/разделение моего проекта совершенно неправильной? Должен ли я добавить еще один модуль с родительским POM? Это звучит неправильно, поскольку в справочнике POM указано:
Наследование и агрегация создают удобную динамику для управления сборками через единую высокоуровневую POM. Вы часто будете видеть проекты, которые одновременно являются и родительскими, и агрегаторами.
Я совсем потерялся здесь.
Мои ожидания:
- запустить
Maven package
наshaker-multi-webapp
и получить развертываемую войну; - запустите
Maven package
наshaker-multi-runnable
и получите запускаемый из командной строки jar (мне все еще нужно настроить его POM для создания jar-с-зависимостями, хотя, я знаю); - запустить
Maven package
наshaker-multi
и получить какой-то комплект, который я могу перемещать и который будет содержать war или jar каждого модуля.
ИЗМЕНИТЬ
я добавил
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
на shaker-multi-webapp
POM, как показано в этом ответе, но без разницы.
EDIT-2
Я очистил весь свой локальный репозиторий (как было предложено здесь), и когда я снова открыл Eclipse, в консоли Maven я увидел
[...] 05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/main/java 05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/test/java **05/09/14 07:58:19 CEST: [ERROR] Could not read web.xml** [...]
Любой намек? Откуда оно взялось? Однако я не могу воспроизвести его (без повторного удаления всего моего локального репо).
Это shaker-multi
ПОМ:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<modules>
<module>shaker-multi-core</module>
<module>shaker-multi-runnable</module>
<module>shaker-multi-webapp</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Это shaker-multi-core
ПОМ:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-core</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<plugin><!-- jOOQ plugin--></plugin>
</plugins>
</build>
<dependencies>
<dependency><!-- jOOQ dependency --></dependency>
</dependencies>
</project>
Это shaker-multi-webapp
ПОМ:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-webapp</artifactId>
<packaging>war</packaging>
<build>
<plugins>
<plugin><!-- Tomcat local -->
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<!-- JSP & Servlet dependencies -->
</dependency>
</dependencies>
</project>