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

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

1 голос
/ 20 апреля 2010

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

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

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

редактирование:

Среди других причин, по которым я не хочу добавлять их в корпоративное репо, это:

  1. Эти файлы JAR больше не используются. Их много, необычных и эксклюзивных для Oracle.
  2. В любой момент времени будет использоваться только одна версия данного JAR-файла. Никогда не будет случая, когда Приложение A зависит от 1.0, а Приложение B зависит от 1.1. Приложение A и B будут зависеть только от 1.1 или 1.2.
  3. Мы планируем поддерживать более 100 приложений. Это много файлов pom.xml, то есть каждый раз, когда мы обновляем Oracle ADF, если какая-либо зависимость не была правильно указана (из-за человеческой ошибки), нам придется исправлять каждую ошибку каждый раз, когда мы редактируем эти более 100 файлов pom.xml для обновить.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

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

  1. Поместите зависимости в репозиторий (это может быть файловый репозиторий, как описано в этот ответ ) и объявите их с областью действия provided.
  2. Используйте грязный трюк области действия system (то есть объявите зависимости с областью системы и установите путь к jar-файлам в вашей файловой системе.
  3. Небольшое изменение # 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, другие jar станут «видимыми» без необходимости явно перечислять их в вашем POM (конечно, вам нужно объявить их в манифесте, но это может быть очень легко написано в сценарии).

1 голос
/ 24 апреля 2010

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

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

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

Обновлен:

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

1 голос
/ 20 апреля 2010

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

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

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

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

(«Уродливым» вариантом было бы вообще не использовать maven, поместить jar-файлы в относительное местоположение и добавить их в путь к классам проекта, передав файл свойств classpath (в зависимости от IDE))

...