Лучший подход к настройке внешней зависимости в 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. Так что этот "умный" подход в любом случае не сработает.

Другие вопросы по тегам