Почему 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», он действительно загрузит для меня jar ( bundle ). Что заставило меня задуматься, почему я вообще назвал это комплектом? Ну, я сделал это, потому что, когда я использовал m2e для поиска артефакта, он назвал его «связкой»; на самом деле m2e сгенерировал те координаты, которые я привожу выше.

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


person chad    schedule 29.03.2012    source источник
comment
Проверьте этот вопрос stackoverflow.com/questions/5389691/   -  person jordeu    schedule 30.03.2012
comment
Спасибо, но в этом сообщении просто говорится, что пакет - это пакет osgi. Я знаю это. Меня беспокоит, почему maven, похоже, не может разрешить артефакт.   -  person chad    schedule 30.03.2012


Ответы (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 объявляет его, вы можете просто удалить тип. Однако, если сама ваша зависимость имеет зависимость типа bundle, то вы облажались, потому что тогда одна из ваших транзитивных зависимостей имеет тип bundle, и вы не можете просто удалить тип в ней, поскольку вы не являетесь владельцем этот артефакт и не имеет доступа к 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>
person Hilikus    schedule 12.12.2013