Конкретный classpath для Maven

1

Совершенно новый для maven здесь, поэтому позвольте мне сначала объяснить, что я пытаюсь сделать:

У нас есть определенные файлы JAR, которые не будут добавлены в репо. Это связано с тем, что они специфичны для Oracle ADF и уже размещены на нашем сервере приложений. Для всех приложений в любой момент можно использовать только одну версию. Однако для компиляции мы должны иметь их на пути к классу. Есть много этих JARS, поэтому, если мы должны перейти на более новую версию ADF, нам нужно будет войти в каждое приложение и переопределить некоторые довольно избыточные зависимости. Поэтому снова моя цель - просто добавить эти JAR в путь к классам, поскольку мы будем контролировать, какая версия фактически используется в другом месте.

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

изменить

Среди других причин, почему я не хочу добавлять их в корпоративное репо, заключается в следующем:

  • Эти JAR не используются ничем другим. Их много, необычно и эксклюзивно для Oracle.
  • В любой момент будет использоваться только одна версия данного JAR. Никогда не будет случая, когда приложение A зависит от 1.0, а приложение B зависит от 1.1. Оба приложения A и B будут зависеть только от 1.1 или 1.2.
  • Мы планируем поддерживать более 100 приложений. Это много файлов pom.xml, то есть в любое время, когда мы обновляем Oracle ADF, если какая-либо зависимость не была правильно указана (с помощью человеческой ошибки), мы должны будем исправить каждую ошибку каждый раз, когда мы редактируем эти 100+ pom.xml файлов для обновить.
Теги:
maven-2
oracle-adf
weblogic

3 ответа

3
Лучший ответ

Я вижу три варианта:

  • Поместите зависимости в репозиторий (может быть репозиторий файлов, как описано в этот ответ) и объявите их с областью provided.
  • Используйте грязный трюк области system (т.е. объявите зависимости с системной областью и задайте путь к банкам в вашей файловой системе.
  • Небольшая вариация # 2: создайте банку с MANIFEST.MF, ссылаясь на все банки (используя относительный путь) и объявите зависимость от этой почти пустой банки с областью system.

Чистым способом является вариант №1, но другие будут работать и в вашем случае. Вариант № 3 кажется самым близким к тому, что вы ищете.

Обновление: Чтобы уточнить вариант # 3

Скажем, у вас есть каталог с a.jar и b.jar. Создайте c.jar с записью Class-Path в своем META-INF/MANIFEST.MF, в котором перечислены другие банки, примерно так:

Class-Path: ./a.jar ./b.jar 

Затем объявите зависимость в вашем POM на c (и только на c) с областью system, другие банки станут "видимыми", не указывая их явно на вашем POM (конечно, вам нужно объявить их в манифесте, но это может быть очень легко написано сценарием).

  • 0
    Относительно № 3. Сможем ли мы добавить все JAR-файлы в данный каталог или мы должны указать каждый JAR-файл, один за другим?
1

Если вы разрабатываете компоненты ADF (10g/11g, я думаю), я полагаю, вы будете использовать JDeveloper в качестве IDE. JDeveloper поставляется с очень богатым инструментом управления библиотекой, который позволяет вам определить, какие библиотеки необходимы для компиляции или какие пакеты должны быть упакованы для развертывания. Я полагаю, вы уже знаете, как добавлять библиотеки в проекты и указывать в профиле развертывания, которые следует выбирать при упаковке. Если вы хотите сохранить свои библиотеки из maven, возможно, это лучший подход. Скажем, библиотеки, на которые вы ссылаетесь, также являются "Webcenter", используя этот подход, гарантируют, что у вас есть соответствующие библиотеки, поскольку JDeveloper будет поставляться с правильными библиотеками версий.

Тем не менее, поскольку вы используете maven, я бы не рекомендовал хранить некоторые библиотеки из-под контроля и хранилища maven. Я бы рекомендовал выбрать между управлением maven и Oracle JDeveloper. В нашем текущем проекте мы работаем с JDeveloper ADF 11g (и WebCenter), и мы используем maven, это просто упрощает управление библиотекой. В конце концов, у нас будет большое количество сторонних библиотек (скажем, Apache, Spring и т.д.), Которые могут быть полезны для управления maven и не так много библиотек Oracle, которые действительно необходимы для компиляции в среде IDE ( поскольку вам понадобятся только API, а не их реализации). Наш подход заключался в том, чтобы добавить библиотеки Oracle в наш репозиторий maven всякий раз, когда они требуются, и пусть maven контролирует управление зависимостью.

Как говорят другие, в своих ответах, если вы не хотите, чтобы зависимости были включены в любой из ваших артефактов, используйте <scope>provided</scope>. После того, как вы сконфигурируете среду разработки, вы будете благодарны за работу, и вы можете (почти) забыть об управлении зависимостями. Для создания IDE файлов JDeveloper мы используем плагин maven jdev, поэтому mvn jdev:jdev будет генерировать файлы наших проектов и устанавливать зависимости от библиотек и их компиляции должным образом.

Обновлено:

Конечно, вам нужно обратиться к библиотекам ADF в ваши файлы pom. В нашем проекте мы просто ссылаемся на те, которые используются в каждом приложении, скажем, Библиотеки тегов ADF или конкретная служба, а не весь стек ADF/WebCenter. Для этого используйте "предоставленный" объем. Вы все же можете позволить JDeveloper управлять вашими библиотеками, но мы обнаружили, что проще использовать либо 100% -ные библиотеки JDeveloper, либо подход 100% maven. Если вы пойдете с подходом maven, вам потребуется некоторое время, чтобы сначала создать ваше местное репо, но как только это будет очень легко поддерживать, и весь цикл (разработка, сборка, тестирование, упаковка и развертывание) будет проще, с более последовательной конфигурацией. Верно, что в будущем вам придется обновляться до более поздних версий ADF, но поскольку ваша структура репозитория уже будет определена, она должна быть чем-то быстрым. Для будущих обновлений я бы рекомендовал сохранить версию ADF как свойство на вершине pom, что позволит вам быстрее переключиться на новую версию.

  • 0
    А как насчет обновлений до ADF? Вам не нужно заново определять каждую зависимость для каждого отдельного приложения?
  • 0
    @Zombies Конечно, вам нужно обратиться к библиотекам ADF в ваших файлах pom. В нашем проекте мы просто ссылаемся на те, которые используются в каждом приложении, скажем, на библиотеки ADF Tag или на конкретную службу, а не на весь стек ADF / WebCenter. (См обновленный ответ)
1

Хотя вы явно заявили, что не хотите их в репозитории, ваши причины не оправданы. Вот мое предложение:

  • установите эти банки в своей репостории
  • добавьте их как зависимости maven, с <scope>provided</scope>. Это означает, что они предоставлены вашей рабочей средой (сервером приложений) и не будут включены в ваши артефакты (война/ухо)

Проверьте этот похожий вопрос

Целесообразно, чтобы организация, использующая maven, имеет собственный репозиторий. Вы можете видеть Nexus. Затем вы можете установить эти банки в свой репозиторий, и все разработчики будут использовать их, вместо того, чтобы иметь банки только в каждом локальном репозитории.

( "Самый уродливый" вариант будет вовсе не использовать maven, поместите банки в относительное местоположение и добавьте их в путь к классам проекта, отправив файл свойств пути к классам (в зависимости от IDE))

  • 0
    Эти JAR-файлы необычны и не существуют ни в одном известном репо. Можете ли вы указать причину, почему они должны быть добавлены в репо?
  • 0
    Кроме того, каждый раз, когда меняются JAR-файлы (мы обновляем), нам приходится заходить в 100 приложений и редактировать зависимости ...
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню