Использование зависимостей с закрытым исходным кодом в Maven

У меня есть проект с закрытым исходным кодом, который я хотел бы построить с использованием Maven. Он имеет зависимость от двух библиотек Java, которые недоступны ни в одном общедоступном репозитории, который мне удалось найти (в данном случае libGoogleAnalytics.jar и FlurryAgent.jar, но этот вопрос относится к любой зависимости с закрытым исходным кодом).

Мне бы хотелось, чтобы кто-либо в моей организации мог создавать приложение, используя точно такие же версии зависимостей, которые я использую для создания приложения. Это включает в себя моих коллег и наш сборочный сервер.


Как мне управлять зависимостями с закрытым исходным кодом, которые maven не знает, как разрешить?

Очевидно, что я мог пойти на машину каждого человека и вручную выполнить "mvn install:install-file", чтобы получить двоичный файл в их репозиторий maven, но ручное управление такими зависимостями противоречит цели менеджера зависимостей.

В соответствии с документацией по внутренним репозиториям maven, я мог бы где-то установить сервер репозитория и поместить туда двоичные файлы, к которым затем могли получить доступ все разработчики. Но это означает, что у меня есть новый сервер для обслуживания (или, по крайней мере, новый сайт на существующем сервере). Это также означает, что мне нужно беспокоиться о разрешениях, чтобы гарантировать, что внешние стороны не смогут получить доступ к хранилищу. Это также означает, что теперь мне нужно беспокоиться о резервном копировании и доступности, чтобы разработчики не сталкивались с икотой, если репозиторий недоступен.

Все эти проблемы исчезли бы для меня, если бы я мог каким-то образом использовать нашу существующую scm (в данном случае hg, но это может быть git или svn или что-то еще) для хранения зависимостей. Наш репозиторий системы контроля версий уже зарезервирован, в основном он всегда будет доступен разработчикам, выполняющим сборку, и с его разрешениями уже разобрались.

Но я пока не смог понять, как управлять зависимостями maven с помощью hg, если это вообще возможно.

3 ответа

Решение

Оказывается, ответ Манфреда не совсем сработал для меня. Приложение скомпилировано, но оно не запустилось на моем устройстве Android, так как отсутствовали необходимые классы Google Analytics.

Следуя предоставленным им ссылкам, я обнаружил, что это решение немного чище и работает должным образом.

Таким образом, я добавил следующие зависимости в свой pom.xml. GroupId, artifactId и version были созданы мной с использованием разумных значений:

<dependencies>
    ...
    <dependency>
        <groupId>com.google.android.apps.analytics</groupId>
        <artifactId>libGoogleAnalytics</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>com.flurry</groupId>
        <artifactId>FlurryAgent</artifactId>
        <version>1.24</version>
    </dependency>
</dependencies>

Затем я добавил определение репозитория для хранения сторонних зависимостей в дереве исходного кода моего проекта:

    <repository>
        <id>third.party.closed.source.repo</id>
        <url>file://${basedir}/../maven_repo_3rd_party</url>
    </repository>

Затем я переместил файлы jar в следующее место:

./maven_repo_3rd_party/com/google/android/apps/analytics/libGoogleAnalytics/1.1/libGoogleAnalytics-1.1.jar
./maven_repo_3rd_party/com/flurry/FlurryAgent/1.24/FlurryAgent-1.24.jar

Как только я это сделал, мой проект компилировался и работал точно так же, как если бы сторонние зависимости были разрешены из официального репозитория maven.

Хотя я действительно считаю, что вы должны использовать выделенный сервер репозитория, и Шон Патрик совершенно прав, в этом есть хак, чтобы заставить его работать.

Поместите файл jar в папку libs точно так же, как вы это делали в прошлые дни (вспомните Ant.. ой), а затем объявите зависимость для каждого jar, используя систему видимости и путь.

Пример может я это сделал для описанного здесь

http://www.simpligility.com/2010/01/how-to-mavenize-a-typical-web-application-build-jasperserver-3-7-sample-webapp/

В частности, зависимость будет выглядеть следующим образом

<dependency>
  <groupId>jasperreports</groupId>
  <artifactId>jasperreports-chart-themes</artifactId>
  <version>3.7.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/jasperreports-chart-themes-3.7.0.jar</systemPath>
</dependency

О, и теперь, когда я рассказал вам, как это сделать, имейте в виду, что это ПЛОХАЯ практика, и у нее есть куча проблем, но она будет работать...

Использовать выделенный сервер репозитория

В соответствии с документацией по внутренним репозиториям maven, я мог бы где-то установить сервер репозитория и поместить туда двоичные файлы, к которым затем могли получить доступ все разработчики.

Именно так. Настройте сервер репозитория maven с несколькими репозиториями, например:

  • internal-releases
  • internal-snapshots
  • external-opensource
  • external-closedsource (это то место, о котором идет речь о lib

Но это означает, что у меня есть новый сервер для обслуживания (или, по крайней мере, новый сайт на существующем сервере). Это также означает, что мне нужно беспокоиться о разрешениях, чтобы гарантировать, что внешние стороны не смогут получить доступ к хранилищу.

Да, но компания, которая занимается серьезной разработкой программного обеспечения, должна иметь такую ​​инфраструктуру. Но если ваша компания серьезно относится к использованию Maven, вероятно, должна быть специальная должность для управления конфигурацией, и этот человек должен администрировать этот сервер.

Это также означает, что теперь мне нужно беспокоиться о резервном копировании и доступности, чтобы разработчики не сталкивались с икотой, если репозиторий недоступен.

Стандартные серверы репозитория (например, Sonatype Nexus) надежны. Если он зависнет, просто перезапустите сервер приложений / контейнер сервлетов, на котором он запущен. Кроме того, как только разработчики загрузили библиотеку из хранилища, она остается в локальном хранилище, поэтому даже если хранилище не работает, проблем не должно быть (но вы не можете ссылаться на новую зависимость, когда сервер не работает),


Используйте ваш существующий SCM в качестве репозитория Maven

Хорошо, если вы действительно хотите использовать SCM в качестве репозитория Maven, вот как это сделать:

http://maven-svn-wagon.googlecode.com/svn/site/index.html

В этой статье описывается настройка репозитория maven на основе SVN для вашего собственного проекта. Но если вы хотите развернуть стороннее хранилище в репозитории, просто создайте pom с конфигурацией, упомянутой здесь, и используйте этот pom для развертывания: deploy-file вашей библиотеки.

(Существуют и другие реализации wagon / scm, и конфигурация немного отличается, но решение остается тем же: создайте pom в соответствии с используемой реализацией wagon, а затем выполните deploy:deploy-file (см. больше информации на странице использования)

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