Почему maven не может найти зависимость от пакета osgi? - PullRequest
14 голосов
/ 30 марта 2012

Я объявил комплект 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 так это называет?

1 Ответ

28 голосов
/ 13 декабря 2013

Это не глюк в м2е, как указано в принятом ответе.Проблема в том, что 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>

Проблема с принятым ответом состоит в том, что он работает, если зависимость типа bundle является прямой зависимостью;так как это делает ваш 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>
...