Maven: системная зависимость, указывающая на несколько банок

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

Я уверен, что это совершенно неортодоксально, однако мне просто интересно, возможно ли это. Так что-то вроде:

<dependency>
  <groupId>foo</groupId>
  <artifactId>foo</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/lib/foo/*.jar</systemPath>
</dependency>

Ответ 1

Сначала (и я никогда не повторю его достаточно), используя system, ограниченные области не рекомендуется, если вы точно не знаете, что делаете. Из Области зависимости:

system. Эта зависимость требуется на некоторых этапах вашей жизненного цикла проекта, но конкретная система. Использование этой области не рекомендуется: это считается "продвинутый" вид функции и должен только если вы действительно понимаете все последствия его использования, которые могут быть чрезвычайно тяжелыми, если не на самом деле невозможно квантифицировать. Этот объем по определению предоставляет построить не переносной. Это может быть необходимо в некоторых случаях края. системная область включает <systemPath>, который указывает на физическое местоположение этого зависимость от локальной машины. это таким образом, используется для обозначения какого-либо артефакта ожидается присутствовать на данном локальная машина не в репозитории; и путь которого может изменяться машина-машина. systemPathэлемент может ссылаться на среду переменные на своем пути: ${JAVA_HOME}например.

Теперь, чтобы строго ответить на ваш вопрос, объявление зависимости с областью system, которая будет указывать на несколько банок, "возможна" IF, зависимость имеет MANIFEST.MF, перечисляя другие JAR относительно его запись Class-Path. Что-то вроде этого (предполагая, что "корневая" зависимость находится в lib):

Class-Path: ../lib/bar.jar ../lib/foo.jar

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

Ответ 2

Насколько я понимаю, вы ищете простой способ управлять зависимостями с локальными файлами jar (расположенными в папке ${basedir}/lib/foo/'в вашем случае). Используя addjars-maven-plugin, это просто. Просто добавьте следующую декларацию вашему pom:

<plugin>
  <groupId>com.googlecode.addjars-maven-plugin</groupId>
  <artifactId>addjars-maven-plugin</artifactId>
  <version>1.0.2</version>
  <executions>
    <execution>
        <goals>
            <goal>add-jars</goal>
        </goals>
        <configuration>
            <resources>
                <resource>
                    <directory>${basedir}/lib/foo</directory>
                </resource>
            </resources>
        </configuration>
    </execution>
  </executions>
</plugin>

Ответ 3

Я никогда не делал этого, но согласно основным концепциям maven, я думаю, что это может быть невозможно, потому что каждый артефакт представлен одним объектом (банком, zip, tar и т.д.), Следовательно, может быть невозможно иметь несколько банок, представляющих один артефакт.

Morever системная область зависимости всегда доступны и не просматриваются в репо. Они должны ограничиваться только зависимыми от jvm или jdk зависимостями (которые теперь предоставляются jdk, но ранее были доступны как отдельные загрузки)

Ответ 4

У меня похожая проблема; проприетарное программное обеспечение, которое я использую, не имеет общедоступного репозитория Maven, но упаковано с почти 200 банками. Я подошел к проблеме следующим образом:

cd /folder
ls *.jar > folder.txt

Затем замените каждую строку folder.txt

^(.+)$

с

<dependency><groupId>folder</groupId><artifactId>$1</artifactId><version>1.0</version><scope>system</scope><systemPath>${folder.root}/folder/$1</systemPath></dependency>

Скопируйте результаты в ваш pom.xml.