Maven: системная зависимость, указывающая на несколько банок - PullRequest
12 голосов
/ 16 августа 2010

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

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

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

Ответы [ 4 ]

13 голосов
/ 02 марта 2012

Насколько я понимаю, вы ищете простой способ управления зависимостями от локальных 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>
8 голосов
/ 16 августа 2010

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

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

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

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

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

3 голосов
/ 16 августа 2010

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

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

0 голосов
/ 07 июня 2019

У меня похожая проблема; проприетарное программное обеспечение, которое я использую, не имеет общедоступного репозитория 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...