Multi-Module Maven Project и Jetty: Run
-
30-09-2019 - |
Вопрос
Я пытаюсь разделить проект War Maven на два модуля, чтобы я мог создать отдельный файл JAR с инструментами командной строки. Результат имеет следующую структуру:
pom.xml
(упаковкаpom
, имеет два модуля)project-jar/
pom.xml
(упаковкаjar
)
project-war/
pom.xml
(упаковкаwar
, зависит отproject-jar
)
Если я бегу mvn
Команды из рута, все работает нормально. Я хотел бы продолжать использовать mvn jetty:run
, но для этого мне нужно выполнить команду в подпроекте войны. Если я это сделаю, не сможет найти project-jar
Подпроект, так что он не будет работать. Четное mvn jetty:run-war
с полностью собранным файлом войны в target
Справочник не удается, потому что сначала пытается «строить» проект. Мне только удалось сделать это работать, установив project-jar
в местный репозиторий Maven, который не очень приятно.
Есть ли способ использовать плагин моча в мультимодульную настройку Maven?
Решение
Там нет волшебного решения, а единственный, кого я знаю, немного взлом и положится на extraClasspath
Элемент, который вы можете использовать, чтобы объявить каталоги дополнительных классов, относительно. Как это (от Драйв-662.):
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.0.1.v20091125</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppConfig>
<contextPath>/my-context</contextPath>
<extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath>
</webAppConfig>
<scanTargets>
<scanTarget>../my-jar-dependency/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>
Другие советы
Создайте профиль внутри модуля War (project-war
). В этом профиле настройте пристань, чтобы прикрепить к этапу жизненного цикла и выполнить run
цель явно. Теперь, когда Maven проходит от проекта Toplevel с помощью этого профиля включена, он будет включать в себя Jetty: Run и иметь разрешение в зависимости от сестринской модули (как это нормально при выполнении команд Maven из проекта Toplevel).
Пример конфигурации, при размещении в POM.XML веб-модуля (project-war
), устроится для приема: бегите выполнить во время test
фаза. (Вы можете выбрать другую фазу, но убедитесь, что это после compile
.)
Беги из Toplevel: mvn test -Pjetty-run
или mvn test -DskipTests=true -Pjetty-run
. Отказ Это будет скомпилировать зависимости по мере необходимости и сделать их доступными, но вызвать присячную работу: запустить в правильном модуле.
<profiles>
...
<!-- With this profile, jetty will run during the "test" phase -->
<profile>
<id>jetty-run</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.1.6.v20100715</version>
<configuration>
...
<webAppSourceDirectory>
${project.build.directory}/${project.build.finalName}
</webAppSourceDirectory>
...
</configuration>
<executions>
<execution>
<id>jetty-run</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
Использование Extraclasspath в работе присяжных работает ... но по какой-то причине, если зависимые банки (из других модулей) устарели, некоторые вещи не будут работать правильно.
Добавьте плагин Jetty в корневой POM и настройте ContexThandler, указывая на желаемую войну. Это работает для меня в проекте с несколькими барными модулями и двумя накладными войнами.
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M2</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextHandlers>
<contextHandler
implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.basedir}/project-war/target/project-war-${project.version}.war</war>
<contextPath>/</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
</plugin>
Я знаю, что вы просите конфигурацию плагина, но вы можете просто определить проект в команде Maven:
$ mvn jetty:run --projects project-war