2012-04-09 3 views
6

Jestem obecnie w trakcie konwersji dużego projektu wielomodułowego (~ 100 podmodułów) do korzystania z Maven. Obecnie używamy Ant + Ivy.Inteligentniejsza obsługa zależności Native z Maven

tej pory bez większych problemów zostały przycięte i jestem wygodny, że Maven jest nadal dobrym rozwiązaniem. Zastanawiam się jednak, czy istnieje lepszy sposób na radzenie sobie z natywnymi zależnościami.

dotąd doszedłem do następujących wniosków.

  1. Najlepiej jest zainstalować każdą natywną zależność w repozytorium maven jako autonomiczną bibliotekę lub zarchiwizowany pakiet zawierający wiele zależności.
  2. Zamiast zgubić się w oświadczając każdy zależność z wtyczką zależności Maven, zdecydowałem się dać każdy klasyfikator (np tubylcy Win32) i używać następujących w POM dominującej:

     <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-dependency-plugin</artifactId> 
         <version>2.4</version> 
         <executions> 
          <execution> 
           <id>copy</id> 
           <phase>compile</phase> 
           <goals> 
            <goal>copy-dependencies</goal> 
           </goals> 
           <configuration> 
            <includeScope>runtime</includeScope> 
            <includeClassifiers>natives-win32</includeClassifiers> 
            <outputDirectory>${project.build.directory}/natives</outputDirectory> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
    

Do tej pory wydaje się to być prostym i wszechstronnym rozwiązaniem, które nie wymaga zbytniego dodawania nowych zależności natywnych. Oferuje mi również proste i wszechstronne rozwiązanie do zarządzania tubylcami. Jedyne, co muszę zrobić, to upewnić się, że mój katalog// native/jest zdefiniowany w java.library.path.

Jedna rzecz, która mnie denerwuje (trochę) na temat tego podejścia jest to, że wszystkie moje rodzime zależności kopiowane wokół każdej podmodułem wyrażającej zależność przechodni na nich, podczas gdy moje szczęśliwe biblioteki jar są dodawane do ścieżki klasy odwołuje się do gdzie znajdują się w moim lokalnym repozytorium (kopia nie jest wymagana).

Nie ma sposobu, aby być mądrzejszym o tym i mieć odniesionych moich rodowisk z ich lokalizacji repozytorium (zakładając, że nie mam ich zarchiwizowane, czyli dll). To zaoszczędziłoby sporo niepotrzebnego kopiowania.

Czy są jakieś inne potencjalnych pułapek, że powinienem być zaniepokojony z powyższym podejściem?

+0

Jak rozwiązałeś to przez Ivy? Sposób, w jaki to opisałeś? – khmarbaise

+0

Wygląda na to, że rozwiązano go dość słabo dzięki naszym konfiguracjom Ivy. Po pierwsze, konfiguracje debugowania/uruchamiania dla środowiska Eclipse konfigurują zależności środowiska wykonawczego, odwołując się do każdego z nich we współużytkowanym repozytorium, które jest zmapowanym katalogiem na każdym komputerze programisty. Po wdrożeniu lub przetestowaniu skrypty mrówek przejmują i przesuwają zależności zależnie od potrzeb. To jest niezły bałagan. – S73417H

+0

Hmmm, podoba mi się twoje rozwiązanie.Wydaje się, że to, czego naprawdę chcesz, jest dodatkowym celem wtyczki zależności, która ustawia właściwość jako listę ścieżek rozwiązanych zależności. To byłby ostatni element układanki. Powinno być łatwe, dlaczego nie wziąć noża na łatkę? Ping mi, jeśli uda ci się napisać taką łatkę, a ja przyjrzę się jej zastosowaniu. –

Odpowiedz

0

Skończyło się na tym, że korzystałem z maven natives plugin i zajmowałem się faktem, że mam nadmiarowe kopie natywnych bibliotek w tym miejscu. Powodem tego była przede wszystkim prostota, jaką oferuje wtyczka oraz fakt, że posiada ona również powiązaną wtyczkę zaćmienia, która ustawia rdzennych użytkowników w środowiskach programistów, które wykorzystują środowisko bez interwencji.

+0

Dla porównania rozwikłałem wtyczkę mavennatives i ulepszono ją. Oferuje te same funkcje i kilka ulepszeń szybkości, nie pobierając zależności pobieranych od twojej platformy i wiele więcej. Znajdź nativedependencies-maven-plugin tutaj, jeśli zainteresowany: https://github.com/fmarot/nativedependencies-maven –

0

Twój fragment pokazuje cel dołączony do fazy budowy, a nie zależności. Czy cel "zależności kopiowania" jest w super-pom i dziedziczony przez wszystkie moduły? Nie ma sposobu, aby przenieść go tylko do modułów, które będą uruchamiane/pakowane jako aplikacja?

0

Możliwe, że go nie dostałem. Ale dlaczego najpierw nie wdrożysz wszystkich swoich rodzimych bibliotek do repozytorium. Jeśli natywne biblioteki są stabilne i rzadko się zmieniają, można to zrobić w oddzielnym reaktorze.

A potem odwołać te rodzime zależności prostu poprzez WDB jak inne uzależnienia. Rozwiązany zostaje również problem niepotrzebnego kopiowania.