Лучший подход к настройке внешней зависимости в Maven
Я надеюсь, что объясню это как можно точнее, и я хочу знать, правильно ли я установил зависимости maven, или есть ли лучший способ сделать это.
Большинство проектов моей команды разработчиков основаны на доморощенном фляге, которая развернута в загрузчике серверных классов. Причина того, что этот jar-файл находится на этом уровне, заключается в простоте обновления jar-файла без переупаковки каждого проекта, который его использует, при условии, что внесенные в него изменения обратно совместимы.
Я разрабатываю свои веб-приложения против Jetty в своей локальной разработке. Итак, чтобы веб-приложения работали локально, я настроил зависимости следующим образом:
<dependencies>
<!-- Configuring external jar dependency -->
<dependency>
<groupId>com.test.app</groupId>
<artifactId>app-jar</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${env.EXTERNAL_JAR}</systemPath>
</dependency>
...
</dependencies>
<build>
<plugins>
<!-- Configuring Jetty -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<contextPath>/${project.parent.artifactId}</contextPath>
<jettyEnvXml>${env.JETTY_ENV_XML}</jettyEnvXml>
<scanIntervalSeconds>1</scanIntervalSeconds>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>7777</port>
</connector>
</connectors>
<webAppConfig>
<extraClasspath>${env.EXTERNAL_JAR}</extraClasspath>
</webAppConfig>
</configuration>
</plugin>
...
</plugins>
</build>
При таком подходе я устанавливаю переменную среды, которая указывает на внешний путь jar, и ссылаюсь на нее в моем файле pom.xml как ${env.EXTERNAL_JAR}
,
После некоторого чтения кажется, что использование "системной" области видимости считается плохой практикой. Итак, я установил этот внешний jar в Nexus и изменил область действия на "предоставлено":-
<dependency>
<groupId>com.test.app</groupId>
<artifactId>app-jar</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
Это позволяет мне правильно скомпилировать проект, но я не уверен, смогу ли я вообще полностью избавиться от переменной среды "EXTERNAL_JAR", потому что она все еще необходима для правильной работы среды выполнения Jetty. Я предпочитаю использовать "предоставленную" область видимости, это немного утомительно и требует дополнительной работы, потому что теперь мне нужно помнить об обновлении jar в Nexus, когда он модифицирован, и мне все еще нужно обновить jar, расположенный по пути, указанному переменной среды.
Есть ли способ для меня, чтобы выставить внешний jar для Jetty через зависимости maven, но не быть упакованным в проект при создании файла war?
Что вы посоветуете по этому поводу? Должен ли я просто придерживаться "системной" области видимости, чтобы мне просто нужно было обновить банку в одном месте, или я должен использовать "предоставленную" область видимости? Или есть ли лучший способ сделать это?
Большое спасибо.
3 ответа
Вы должны быть в состоянии добавить зависимости к плагину Jetty. И тогда у меня есть предусмотренная область для самого проекта.
http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin
как в
<project>
...
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<systemProperties>
<systemProperty>
<name>logback.configurationFile</name>
<value>./src/etc/logback.xml</value>
</systemProperty>
</systemProperties>
</configuration>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.15</version>
</dependency>
</dependencies>
</plugin>
...
<project>
Лучше всего настроить внешний репозиторий со своей зависимостью и добавить его в свой pom.
<repositories>
<repository>
<id>my-repo</id>
<name>my-repo</name>
<url>http://your.repo.url</url>
</repository>
</repositories>
а затем вы можете добавить свою зависимость как
<dependency>
<groupId>com.test.app</groupId>
<artifactId>app-jar</artifactId>
<version>1.0</version>
</dependency>
Я одобряю предоставленное. Предусмотренное средство - загрузить зависимость на время компиляции, но я ожидаю увидеть ее в classpath на сервере приложений.
Я не осознавал, что вы заботитесь только о вашей локальной разработке, поэтому было бы полезно следующее, если вы запускаете Jetty на внешнем сервере:
Maven позволит вам развернуть файл на сервере с помощью плагина Wagon. Таким образом, частью вашего процесса сборки может быть вставка правильного файла.jar в ваш сервер Jetty. Таким образом, вам не придется делать это вручную. Я бы предпочел использовать это решение для запуска локального репозитория Maven на сервере Jetty, как предлагает @Paul.
Если вы хотите быть очень умным (обычно это плохая идея), вы можете попытаться установить репозиторий непосредственно на машине с Jetty, который будет обслуживать флягу непосредственно из вашей установки Jetty. Таким образом, вам не придется модифицировать Nexus, банки будут только в одном месте. Вы даже можете настроить Nexus для зеркалирования другого хранилища, чтобы он мог автоматически подбирать вещи.
Неправильно изменять содержимое.jar и сохранять те же координаты Maven. Так что этот "умный" подход в любом случае не сработает.