2012-03-29 15 views
13

Deklarowałem pakiet OSGi jako zależność w moim projekcie maven. (To właśnie dzieje się pojemnik Felix.)Dlaczego nie można znaleźć zależności od pakietu osgi?

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

Kiedy próbuję budować, to mówi, że nie może go znaleźć.

[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. 

Ale szybkie sprawdzenie w centralnym oknie sprawdza, czy ten artefakt rzeczywiście istnieje. Zauważyłem, że jeśli zmienię go na typ "jar", to rzeczywiście pobierze dla mnie słoik (pakiet). Co zmusiło mnie do zastanowienia się, dlaczego nazwałem to pakietem? Zrobiłem to, ponieważ kiedy używałem m2e do wyszukiwania artefaktu, nazwałem go "wiązką"; w rzeczywistości m2e wygenerowało te współrzędne, które przytaczam powyżej.

Czy zestaw nie jest prawidłowym typem artefaktu maven? Jeśli nie, dlaczego m2e nazywa to tak?

+0

Sprawdź to pytanie http://stackoverflow.com/questions/5389691/what-is-the-meaning-of-type-bundle-in- a-maven-dependency – jordeu

+0

Dzięki, ale ten post mówi tylko, że "pakiet" to pakiet osgi. Wiem to. Martwię się, dlaczego maven nie jest w stanie rozwiązać artefaktu. – chad

Odpowiedz

24

To nie jest usterka w m2e, jak wspomniano w zaakceptowanej odpowiedzi. Problem polega na tym, że maven nie wie, co to jest "pakiet". Musisz więc dodać wtyczkę, która ją definiuje, czyli wtyczkę maven-bundle. Zauważ, że musisz również ustawić właściwość rozszerzeń na true. Więc POM powinien mieć coś takiego

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

Problem z przyjętą odpowiedź jest taka, że ​​to działa, czy zależność od typu pakietu jest bezpośrednią zależność; ponieważ to twój pom to deklaruje, możesz po prostu usunąć ten typ. Jeśli jednak twoja zależność jest zależna od typu pakunku, to znaczy, że jesteś skrępowany, ponieważ wtedy jedną z twoich przechodnich zależności jest pakiet typu i nie możesz po prostu usunąć tego typu, ponieważ nie jesteś właścicielem tego artefaktu i nie jesteś nim. • mieć dostęp do pom, którego ponownie twoja obecna realizacja nie rozumie. spróbuje poszukać repo/your-dependency.bundle

Wystąpił ten problem podczas korzystania z wtyczki zależności do zależności kopii. W takim przypadku zależność od wtyczki musi iść w samej wtyczce. Trzeba tylko plugin zależność wiedzieć o wtyczce wiązki:

<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> 
+4

To naprawdę powinna być zaakceptowana odpowiedź. – JBT