2011-09-13 16 views
5

Mam pakiet OSGi, który został zbudowany przy użyciu Maven przez inny zespół. Plik POM deklaruje jego opakowanie jako "pakiet" i używa wtyczki Apache Felix.Jak wdrożyć pakiet OSGi do repozytorium Maven z wdrożeniem: deploy-file?

Muszę wdrożyć ten artefakt do lokalnego repozytorium Maven (Nexus), aby mógł być używany przez nasze wewnętrzne projekty.

Użyłem celu deploy:deploy-file, aby wdrożyć pakiet w repozytorium, tak jak w przypadku standardowego pliku JAR, który działa bezbłędnie. I ekstrakcji wbudowanego POM z wiązki i podał, że w linii poleceń, więc linia poleceń było:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus 

Kwestia jest taka, że ​​kiedy wdrożyć go w ten sposób, opakowanie jest ustawione na pakiet iw rezultacie nazwa artefaktu w repozytorium kończy się rozszerzeniem .bundle, zamiast rozszerzeniem .jar.

Teraz nie możemy dowiedzieć się, jak zadeklarować to jako zależność. Jeśli zadeklarujemy to w ten sposób:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>bundle</type> 
     </dependency> 

Otrzymujemy błąd stwierdzający, że zależności nie można rozwiązać. Ciekawe jest to, że współrzędne GAV w komunikacie o błędzie faktycznie mają "jar" jako wartość dla typu zależności, mimo że ustawiliśmy ją jako "pakiet".

Jeśli zmienimy zależność do:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>jar</type> 
     </dependency> 

Dostajemy dokładnie ten sam błąd zależnościach nierozwiązany.

W jaki sposób należy wdrożyć artefakt pakowany jako pakiet do repozytorium Maven, aby mógł być używany jako zależność w czasie kompilacji dla innego projektu?

Dzięki

+0

Zdaję sobie sprawę, że moje użycie terminu "lokalne repozytorium" mogło być mylące. Próbuję wdrożyć do repozytorium Nexus na zdalnym serwerze. Serwer jest udostępniany przez wszystkich w naszym zespole. Kiedy powiedziałem "lokalny", domyślam się, co miałem na myśli "wewnątrz naszej ściany ogniowej w naszej sieci LAN". –

Odpowiedz

0

Dzięki za odpowiedzi, myślę, że mam obejście (nie nazwałbym tego rozwiązaniem chociaż).

@ARCAR jest na dobrej drodze, chociaż to rozwiązanie nie wykorzystuje wszystkich informacji dostępnych w pliku pom.xml, który jest już dostępny w pakiecie innej firmy (w szczególności zależności).

To, co wydaje się działać, nawet jeśli dokumentacja do wdrożenia: deploy-file jest trochę niejasna, to można przekazać plik pom.xml i również ustawić parametr pakowania w tym samym czasie. Więc moja linia poleceń wygląda teraz tak:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus -Dpackaging=jar 

Robi to w ten sposób, pom.xml w repozytorium nadal twierdzi, że opakowanie jest typu „pakiet” i obejmuje wszystkie zależności itp, ale sam artefakt ma rozszerzenie .jar.

Wtedy kiedy deklarujemy naszą zależność jako typ JAR, Maven jest w stanie go rozwiązać pomyślnie:

<dependency> 
     <groupId>...</groupId> 
     <artifactId>...</artifactId> 
     <version>...</version> 
     <type>jar</type> 
    </dependency> 

To w zasadzie rozwiązuje nasz problem. Nie jestem jednak pewien, czy to przenośne czy niezawodne. FWIW, prowadzimy Maven 3.0.3

Dzięki za pomoc.

0

może chcesz spróbować usunąć typ całkowicie, a następnie wykonując proste

mvn install 

W katalogu zawierającego plik pom.xml.

+0

Ale to tylko zainstalowałoby artefakt w lokalnym repozytorium maven ... –

+0

Ahh tak, widzę. Myślałem, że odnosisz się do lokalnego repozytorium, ale po chwili przeczytałeś, że masz na myśli nexus. W moim środowisku nexus używamy skryptów powłoki bash, aby je wdrożyć. więc jestem tak samo zainteresowany, jak widzisz, jakie jest rozwiązanie! –

+0

Prawidłowo, zdecydowanie musimy wdrożyć do zdalnego repozytorium z Nexusem, który jest udostępniany przez cały zespół. –

0

Najpierw spróbowałeś po prostu wywołać mvn deploy w swoim folderze pakunku. Spodziewam się, że pakiet zostanie skompilowany, przetestowany i wdrożony, jeśli skonfiguruje się distributionManagement do wdrożenia w twoim nexusie.
Jeśli to się nie powiedzie, możesz ręcznie zaimportować pakiet za pomocą interfejsu sieciowego nexus do hostowanego repozytorium.

+0

Myślę, że przegapiłeś ten punkt. Nie jest to instalowanie, to jest problem, jest to "pakiet" typu używany przez wtyczkę pakietu. – Robin

+0

Ale w jego pytaniu powiedział "3rdpartybundle.jar", który wygląda na to, że artefakt projektu, pakowany jako "pakunek", jest plikiem jar. I o ile widzę na stronie wtyczki Apache Felix Bundle, tworzy plik jar jako artefakt. Jeśli więc artefakt zostanie wdrożony jako ".bundle", powinienem sprawdzić, czy jest skonfigurowana inna wtyczka, która może zmienić nazwę artefaktu przed wdrożeniem. –

+0

Pakiet pochodzi od zespołu innej firmy. Nie mamy źródła itp. Próbujemy wdrożyć już zbudowany pakiet. –

3

Kwestia jest taka, że ​​„3rdpartybundle.jar” jest budowany bez ustawiania rozszerzeń = true i/lub obsługiwanych typów:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
... 
    <extensions>true</extensions> 
... 
    <configuration> 
     <supportedProjectTypes> 
      <supportedProjectType>jar</supportedProjectType> 
      <supportedProjectType>war</supportedProjectType> 
     </supportedProjectTypes> 

Jeżeli nie można ustalić, że górne, potem jest kilka opcji;

1) Zapakuj go jako Jar użyciu nowej pom projektu:

    <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-dependency-plugin</artifactId> 
          <version>2.3</version> 
          <configuration> 
            <actTransitively>false</actTransitively> 
            <outputDirectory>target/classes</outputDirectory> 
            <artifactItems> 
              <artifactItem> 
                <groupId>3rd</groupId> 
                <artifactId>party</artifactId> 
                <version>X.Y.Z</version> 
              </artifactItem> 
            </artifactItems> 
          </configuration> 
          <executions> 
            <execution> 
              <goals> 
                <goal>unpack</goal> 
              </goals> 
              <phase>compile</phase> 
            </execution> 
          </executions> 
        </plugin> 

2) Spróbuj użyć mvn deploy:deploy-file z -DgeneratePom=false -Dpackaging=jar -Dfile=/path/to/3rdpartybundle.jar ale bez określania -DpomFile= - nadzieję, że nie ma META-INF/Maven/pom.xml wewnątrz 3rdpartybundle.słoik - powinien działać, ale musisz określić parametry groupId/artifactId/version, ponieważ nie będą one wyprowadzane z pom-projektu projektu.

Wiem, że w przeszłości tworzyłem artefakty z pakietami i wdrażałem je w naszym nexusie (wer. 1.9.0.1), a te w repozytorium wiosennym również pismem pisanym, ale nie przypominają żadnego problemu. (Nawiasem mówiąc, nie trzeba określać pakunku w deklaracjach zależności, AFAIK, jeśli jest to jedyny artefakt, który należy wywnioskować)

+0

Wpadłem na podobny problem, próbując rozmieścić pliki spakowane z opakowaniem "pakietowym". "-DgeneratePom = false -Dpackaging = jar" było magią, której potrzebowałem. Dzięki. – Jared