Подтвердить что ты не робот

Почему maven не может найти зависимость от пакета osgi?

Я объявил пакет OSGi как зависимость в моем проекте maven. (Это просто контейнер феликса.)

<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.framework</artifactId>
    <version>4.0.2</version>
    <type>bundle</type>
    <scope>compile</scope>
</dependency>

Когда я пытаюсь построить, он говорит, что не может его найти.

[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) org.apache.felix:org.apache.felix.framework:bundle:4.0.2

  Try downloading the file manually from the project website.

Но, быстрый взгляд в центре проверяет, что этот артефакт действительно существует. Я заметил, что если я изменю его на тип "jar", он действительно загрузит кусок (пакет) для меня. Что заставило меня задуматься, почему я назвал это связкой в ​​первую очередь? Ну, я сделал это, потому что, когда я использовал m2e для поиска артефакта, он называл это "связкой"; фактически, m2e порождает те координаты, которые я цитирую выше.

Является ли связка не действительным типом артефакта maven? Если нет, то почему это так?

4b9b3361

Ответ 1

Это не глюк в m2e, как указано в принятом ответе. Проблема в том, что maven не знает, что такое тип "bundle". Поэтому вам нужно добавить плагин, который его определяет, а именно: maven-bundle-plugin. Обратите внимание, что вам также необходимо установить для свойства extensions значение true. Таким образом, POM должен иметь что-то вроде

<plugin>
      <groupId>org.apache.felix</groupId>
      <artifactId>maven-bundle-plugin</artifactId>
      <version>2.4.0</version>
      <extensions>true</extensions>
</plugin>

Проблема с принятым ответом заключается в том, что он работает, если зависимость набора типов является прямой зависимостью; поскольку это ваш pom, который объявляет об этом, вы можете просто удалить этот тип. Однако, если ваша зависимость сама по себе имеет зависимость от набора типов, тогда вы ввернуты, потому что тогда одна из ваших транзитивных зависимостей относится к набору типов, и вы не можете просто удалить этот тип, поскольку вы не являетесь владельцем этого артефакта и не имеете доступ к помпе, что опять не соответствует вашему текущему исполнению. он попытается найти repo/your-dependency.bundle

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.4.0</version>
            <type>maven-plugin</type>

        </dependency>
    </dependencies>
    <extensions>true</extensions>
</plugin>