Maven: Jak włączyć słoiki, które nie są dostępne w powtórzeniach, do projektu J2EE?

100

w moim projekcie J2EE mam kilka zależności, które nie są dostępne w żadnym repozytorium Mavena, ponieważ są to biblioteki zastrzeżone. Te biblioteki muszą być dostępne w czasie wykonywania, więc muszą zostać skopiowane do docelowego /.../ WEB-INF / lib ...

W tej chwili wymieniam je jako zależności systemowe w moim POM, ale w przypadku tej metody problem polega na tym, że nie są one kopiowane do docelowej kompilacji podczas kompilacji. Również ta metoda nie jest zbyt elegancka.

Jaki jest więc najlepszy sposób na ich integrację w Maven?

Uwaga: nie chcę tworzyć własnego repozytorium Maven.

samson
źródło
7
I rzeczywiście , że powinniśmy dokonać przeglądu decyzji o utworzeniu repozytorium Maven. To wcale nie jest trudne iw 100% tego warte.
Robert Munteanu
7
Wartość tworzenia repozytorium Maven zależy od okoliczności.
yincrash

Odpowiedzi:

54

Jak powiedziałeś, że nie chcesz tworzyć własnego repozytorium, być może to pomoże.

Możesz użyć celu pliku instalacyjnego wtyczki maven-install-plugin, aby zainstalować plik w lokalnym repozytorium. Jeśli utworzysz skrypt z wywołaniem Mavena dla każdego pliku i zachowasz go obok plików jars, ty (i każdy, kto ma dostęp) możesz łatwo zainstalować pliki jar (i powiązane pliki pom) w ich lokalnym repozytorium.

Na przykład:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

Lub tylko

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Następnie możesz normalnie odwoływać się do zależności w projekcie.

Jednak najlepszym rozwiązaniem jest skonfigurowanie wewnętrznego zdalnego repozytorium i polecam korzystanie z Nexusa samodzielnie. W razie potrzeby może działać na komputerze deweloperskim, a narzut jest minimalny.

Bogaty sprzedawca
źródło
1
Dzięki temu ta metoda działa teraz dobrze dla mnie. Rozszerzyłem POM tak, aby pliki były automatycznie instalowane do lokalnego przedstawiciela: pastebin.ca/1504318
samson
Cieszę się, że mogę pomóc, ale jak powiedzieli inni, najlepszym podejściem byłoby użycie menedżera repozytorium Maven. To podejście nie jest dobrze skalowane.
Bogaty sprzedawca
4
Polecenie, które zadziałało: „mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick,
193

Dla osób pragnących szybkiego rozwiązania tego problemu:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

po prostu nadaj swojej bibliotece unikalny identyfikator grupy i nazwę artefaktu oraz wskaż, gdzie się ona znajduje w systemie plików. Możesz ruszać.

Oczywiście jest to brudna szybka poprawka, która będzie działać TYLKO na twoim komputerze i jeśli nie zmienisz ścieżki do bibliotek. Ale czasami to wszystko, czego chcesz, uruchomić i zrobić kilka testów.

EDYCJA: po prostu ponownie zredaguj pytanie i zdałem sobie sprawę, że użytkownik już używał mojego rozwiązania jako tymczasowej poprawki. Swoją odpowiedź zostawię jako szybką pomoc dla innych, którzy przyjdą na to pytanie. Jeśli ktoś się z tym nie zgadza, zostaw mi komentarz. :)

Ric Jafe
źródło
4
Chłodny. Czy istnieje sposób na określenie adresu URL zamiast ścieżki do komputera lokalnego?
phreakhead
3
Dziękuję za kompletny i działający przykład !!! Mam nadzieję, że złowisz złotą rybkę i spełni ci ona trzy życzenia. :)
johndodo
14
To powinna być akceptowana odpowiedź, ponieważ jest samodzielna (w pom.xml)
Vikram
2
Cześć Rajarshee, identyfikatory grupy i artefaktu są całkowicie dowolne. Aby to zadziałało, liczy się tylko ścieżka do pliku jar w systemie plików. Ponieważ w rzeczywistości słoik nie jest uzależnieniem od mavena, mówisz Mavenowi tylko, aby traktował go jak jedną.
Ric Jafe,
1
Od 2016 roku wydaje się, że to nie działa. Kompilacja potwierdza ścieżkę, ale nie zawiera kodu w zacieniowanym pliku jar. Szczury ...
markthegrea
24

Utwórz folder repozytorium w swoim projekcie. Weźmy

${project.basedir}/src/main/resources/repo

Następnie zainstaluj niestandardowy jar w tym repozytorium:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Na koniec dodaj następujące definicje repozytorium i zależności do projektów pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>
mostar
źródło
1
To zadziałało dla mnie bardzo dobrze. PS
Poleciłbym
1
Zadziałało jak urok. Przeprowadzam migrację starego projektu z Ant do Maven i jest kilka bibliotek, których nie mogę znaleźć w repozytoriach internetowych.
Paulo Pedroso
Uwaga: jeśli wartość -DlocalRepositoryPath nie kończy się na /(tzn. Wskazuje folder), wówczas repozytorium jest tworzone z groupId. Np .: jeśli identyfikator grupy to, foo.coma localRepositoryPath to repo, wówczas folder repozytorium stanie się repo.foo.com.
Sheshadri Mantha
Ta procedura jest jak projekt lokalny dla zarządzania repozytorium systemu za pomocą narzędzia automatyzacji kompilacji maven używanego głównie dla projektów Java i systemu plików.
Oleksii Kyslytsyn
8

Musisz skonfigurować lokalne repozytorium, które będzie hostować takie biblioteki. Jest wiele projektów, które dokładnie to robią. Na przykład Artifactory .

Gregory Mostizky
źródło
4
Kwestia terminologii, są to wewnętrzne repozytoria zdalne, a nie repozytoria lokalne. Repozytorium lokalne jest tym, do którego pobierane są zależności lokalnego systemu plików.
Bogaty sprzedawca
3

Żadne z rozwiązań nie działa, jeśli używasz kompilacji Jenkins !! Gdy pom jest uruchamiany na serwerze kompilacji Jenkinsa, rozwiązania te nie powiodą się, ponieważ program pom uruchomiony przez Jenkins będzie próbował pobrać te pliki z repozytorium przedsiębiorstwa.

Skopiuj pliki Jars do src / main / resources / lib (utwórz folder lib). Będą one częścią twojego projektu i przejdą do serwera wdrożeniowego. Na serwerze wdrażania upewnij się, że skrypty startowe zawierają src / main / resources / lib / * w classpath. Altówka.

Apurva Singh
źródło
2

możesz je zainstalować w prywatnym, lokalnym repozytorium (np. .m2 / repozytorium w swoim katalogu domowym): więcej szczegółów tutaj

dfa
źródło
7
Tak, mógłbym to zrobić, ale wtedy musiałbym powiedzieć każdemu, kto chce zbudować projekt, że musi umieścić pliki X, Y w katalogu Z, a to naprawdę komplikuje sprawę. W końcu chcę użyć Mavena, aby uprościć proces budowania.
samson
2

Jeśli dobrze rozumiem, jeśli chcesz wyeksportować zależności podczas fazy kompilacji, aby nie było potrzeby ręcznego pobierania każdej potrzebnej biblioteki, możesz użyć mojo copy-dependencies .

Mam nadzieję, że będzie to przydatne w Twoim przypadku ( przykłady )

Erik Clairiot
źródło
2

Rozwiązanie @Ric Jafe zadziałało dla mnie.

To jest dokładnie to, czego szukałem. Sposób na przepchnięcie go do badania kodu testowego. Nic fajnego. Tak, wiem, że tak wszyscy mówią :) Różne rozwiązania wtyczek Mavena wydają się być przesadą dla moich celów. Mam kilka słoików, które zostały mi przekazane jako biblioteki innych firm z plikiem pom. Chcę, aby szybko się skompilował / działał. To rozwiązanie, które w trywialny sposób dostosowałem do Pythona zdziałało dla mnie cuda. Wytnij i wklej do mojego pom. Kod Python / Perl dla tego zadania znajduje się w tym pytaniu i odpowiedziach: Czy mogę dodać jars do ścieżki klas kompilacji maven 2 bez ich instalowania?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1
Paweł
źródło
Powyższe rozwiązanie zwraca „dependencies.dependency.systemPath” dla xx.jar nie powinno wskazywać na pliki w katalogu projektu. Zobacz stackoverflow.com/questions/10935135/…
sarah.ferguson
1

Sama instalacja nie działała dla mnie.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Jonathan Hendler
źródło