Mam projektu z jednego pliku źródłowego, uszeregowane tutaj w całości:Dlaczego bnd dodaje dyrektywę uses dla pakietu używanego tylko w treści metody?
package com.acme.el;
public class ExpressionUtils {
public static Object evaluate() {
new org.apache.commons.el.ExpressionEvaluatorImpl();
return null;
}
}
funkcjonalność jest bez znaczenia dla kwestii. Kiedy budować projektu jako wiązkę OSGi przy użyciu Gradle, manifest zawiera następujące czynności:
Export-Package: com.acme.el;uses:="org.apache.commons.el";version="1.0"
Co przegród mnie to, że dyrektywy uses
. Tak jak zrozumiałem dyrektywę, ma ona na celu zdefiniowanie zależności od innych pakietów, które muszą być propagowane do innych pakietów importujących ten wyeksportowany pakiet - jeśli moje definicje klas lub sygnatury metod odnoszą się na przykład do klas w pakiecie org.apache.commons.el
. Ale w tej klasie zależność od org.apache.commons.el
jest całkowicie zawarta w ciele w ciele metody. Nie jest on ujawniony w interfejsie API i żaden inny pakiet importujący com.acme.el
nie może uzyskać blokady instancji ExpressionEvaluatorImpl
utworzonej w tej metodzie. Więc zależności nie trzeba propagować, prawda?
Czy źle zrozumiałem znaczenie dyrektywy uses
, czy też jej użycie jest niepotrzebne?
Zrobiłem a minimal example GitHub repo for reproduction, które można klonować i importować jako projekt Gradle w środowisku Eclipse.
Przeczytałem rozdział 3.7.5 Pakiety ograniczeń wersji OSGi v4.3.0, ale nie zrobiło mi to o wiele mądrzejszego. Mówi się tylko o tym, kiedy używać dyrektywy 'uses', reszta omawia, w jaki sposób framework powinien obsługiwać te dyrektywy: _ [...] Na przykład, gdy rozszerzają klasy z innego pakietu , lub te inne klasy pojawiają się w podpisach metod. Można zatem powiedzieć, że pakiet ** używa ** innych pakietów. Te zależności między pakietami są modelowane za pomocą dyrektywy uses w nagłówku Export-Package._ –
Twoje zrozumienie ograniczenia "uses" jest poprawne, więc nie jest dla mnie jasne, dlaczego ograniczenie jest generowane przez bnd w tym przypadku. Jeśli masz absolutną pewność, że nie ma innych odniesień do pakietu w innym miejscu, być może znalazłeś błąd; zgłoś go na https://github.com/bndtools/bnd/issues –
Tak, jestem absolutnie pewien - stworzyłem minimalny przykład zawierający tylko jedną klasę wymienioną w pytaniu, którą sam widzisz na połączonym GitHub repo. :) –