Pobierasz wszystkie zależności maven do katalogu NIE w repozytorium?

127

Zacząłem konwertować swój projekt do mavena, ponieważ potrzebowałem użyć biblioteki, która była rozprowadzana tylko w formie binarnej przez mavena, ale po zbyt długim uderzeniu głową w ścianę postanowiłem przestać robić sobie krzywdę i po prostu użyć Mrówka. Chciałbym po prostu poprosić mavena o pobranie pliku jar i wszystkich jego przechodnich zależności do wybranego przeze mnie katalogu, abym mógł po prostu sprawdzić je w moim SCM, tak jak zwykle lubię, i ponownie być błogim programistą.
Jakieś pomysły, jak to łatwo zrobić?

chubbsondubs
źródło
2
Rozważ użycie Ivy i uzyskaj potrzebne zarządzanie zależnościami przechodnimi dzięki mrówce, której ufasz. Lub ugryźć się i użyj struktury katalogów Maven.
Dave Newton
Czy próbowałeś Ivy ?
Tomasz Nurkiewicz
5
Nie, ale poświęciłem całą swoją cierpliwość na zmianę w tym momencie. Może następnym razem. Chcę wrócić do kodowania. Czy można to zrobić z mavenem?
chubbsondubs

Odpowiedzi:

260

Plugin zależność Maven potencjalnie może rozwiązać Twój problem.

Jeśli masz plik pomze wszystkimi określonymi zależnościami projektu, wszystko, co musisz zrobić, to uruchomić

mvn dependency:copy-dependencies

a znajdziesz target/dependenciesfolder wypełniony wszystkimi zależnościami, w tym przechodniami.

Dodanie odpowiedzi Gustavo z dołu : Aby pobrać źródła zależności , możesz użyć

mvn dependency:copy-dependencies -Dclassifier=sources

(poprzez dokumentację wtyczki Apache Maven Dependency ).

Raghuram
źródło
1
Dzięki @Raghuram, szukam tego od wieków.
eskalera
ale co, jeśli chcę skopiować wszystkie zależności do mojego lokalnego repozytorium? Do tego ma być używany? Po co kopiować, jeśli może już jest w lokalnym repozytorium. W każdym razie jest lokalny.
sesja
1
@ses Standardowa kompilacja Mavena (np. kompilacja, test, pakiet, instalacja itp .; brak pewności co do walidacji) już domyślnie kopiuje wszystkie zależności do lokalnego repozytorium. To nie na to. Zamiast tego jest to sytuacja, w której z dowolnego powodu potrzebujesz zależności aplikacji. Używam go teraz do inspekcji bibliotek zależnych pod kątem redundantnych definicji API (np. Niektóre biblioteki będą zawierać API Javax, które mogą kolidować z innymi wersjami tego samego API), ale jest też dobrze, jeśli twoja aplikacja wymaga spakowanych z nią zależności do dystrybucji lub po prostu cokolwiek.
Spanky Quigman
1
+1 za jasną, zwięzłą i pomocną odpowiedź. Po prostu przeszedłem przez ten sam taniec Mavena co OP i po prostu chciałem odzyskać zależności plików JAR. Dzięki! Chciałbym móc +10
Brandon
@Raghuram Technicznie rzecz biorąc, wszystkie (rozwiązane) artefakty są w „celu / zależnościach”. Ponadto istnieje potencjalny problem kolizji nazw, ponieważ współrzędna „groupId” zależności jest ignorowana. Innymi słowy, „zależność: zależności-kopiowania” nie zachowuje struktury układu.
whaefelinger
8

Na podstawie odpowiedzi @Raghuram znajduję samouczek dotyczący kopiowania zależności projektu , po prostu:

  1. Otwórz pom.xmlplik projektu i znajdź to:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
    
  2. Następnie zamień na <plugins> ... </plugins>:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    
  3. I zadzwoń do mavena z linii poleceń mvn dependency:copy-dependencies

Po zakończeniu utworzy folder target/dependencywe wszystkich jarzależnościach od bieżącego katalogu, w którym znajduje się plik pom.xml.

użytkownik
źródło
Gdzie mam wpisać polecenie „mvn”? Kliknij prawym przyciskiem myszy maven-project-> Maven -> .. ??
Pieczone Inhalf
W wierszu poleceń terminala w folderze, w którym pom.xmlznajduje się plik.
użytkownik
1
Nie udało się. Myślę, że Maven jest instalowany tylko jako wtyczka. Musiałem również ręcznie pobrać Maven. Wtedy mvn dependency:copy-dependencieszadziałało!
Pieczone Inhalf
8

W końcu wymyśliłem, jak używać Mavena. Z poziomu Eclipse utwórz nowy projekt Maven.

Pobierz Maven, wypakuj archiwum, dodaj /binfolder do ścieżki.

Sprawdź poprawność instalacji z wiersza poleceń, uruchamiając mvn -v(wypisze wersję i ścieżkę instalacji Java)

Przejdź do folderu głównego projektu (gdzie pom.xmlsię znajduje) i uruchom:

mvn dependency:copy-dependencies

Wszystkie pliki jar są pobierane do /target/dependency.

Aby ustawić inny katalog wyjściowy:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Teraz jest możliwe ponowne użycie tego projektu Maven do pobierania wszystkich zależności przez zmianę pliku pom.xml

Dodaj pliki JAR do projektu java według ścieżki kompilacji -> skonfiguruj ścieżkę kompilacji -> biblioteki -> dodaj pliki JAR.

Pieczone Inhalf
źródło
1
Niekoniecznie musi to być projekt zaćmienia. Otworzyłem plik jar w Java Decompiler i skopiowałem pom.xml do pustego folderu. Zadzwoniłem, mvn dependency:copy-dependenciesjak opisałeś, z tego folderu i wszystkie zależne pliki jar zostały ładnie skopiowane do jednego folderu.
Bernhard Döbler
4

Znalazłem następne polecenie

mvn dependency:copy-dependencies -Dclassifier=sources

tutaj maven.apache.org

Gustavo
źródło
2

Sprawdź, czy masz jakieś pliki konfiguracyjne w ${MAVEN_HOME}/confkatalogu takim jak settings.xml. Te pliki zastępują ustawienia z .m2folderu iz tego powodu folder repozytorium z .m2może nie być widoczny lub odrzucony.

MagGGG
źródło