zmusza Maven do kopiowania zależności do target / lib


252

Jak mogę skopiować zależności środowiska wykonawczego mojego projektu do target/libfolderu?

Tak jak jest teraz, po mvn clean installtym, jak targetfolder zawiera tylko słoik mojego projektu, ale nie ma żadnych zależności w czasie wykonywania.


Dlaczego tego potrzebujesz? Jaki jest typ twojego projektu maven? słoik?
Alexandre Victoor,

Typ mojego projektu maven to JAR. Potrzebuję tego, ponieważ istnieje wiele zależności i próbuję wdrożyć słoik jako plik wykonywalny.
Michael

2
Ostrożnie z zestawami - jeśli masz nakładające się pakiety / klasy między deps, prawdopodobnie będziesz miał zły czas.
demaniak

Odpowiedzi:


259

To działa dla mnie:

<project>
  ...
  <profiles>
    <profile>
      <id>qa</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

11
Jeśli chcesz, to zdarzają się cały czas, należy wyjąć <profile> ... <profil> owijarki i sprawiają, że <build> tag być tuż pod <projekt>
Dan Halbert

3
@Georgy to nie coy słoiki w lib /, ale obejmuje klasy w skompilowanym projekcie
Midhat

5
Jest w porządku, ale kopiuje również zależności testowe. Dodaję sobie excludeScopeopcję ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa,

Działa dobrze, ale nie jest wymagane umieszczanie znacznika kompilacji wewnątrz znaczników profilu.
Julien BRENELIERE

2
Uwaga: <excludeScope>test</excludeScope>wchodzi do configurationwęzła.
Jesse Chisholm,

84

Najlepsze podejście zależy od tego, co chcesz zrobić:

  • Jeśli chcesz połączyć swoje zależności w plik WAR lub EAR, po prostu ustaw typ opakowania swojego projektu na EAR lub WAR. Maven umieści zależności w odpowiedniej lokalizacji.
  • Jeśli chcesz utworzyć plik JAR zawierający kod wraz ze wszystkimi zależnościami, użyj wtyczki asemblera z deskryptorem jar-with-dependencies . Maven wygeneruje pełny plik JAR ze wszystkimi twoimi klasami oraz klasami z dowolnych zależności.
  • Jeśli chcesz po prostu interaktywnie wciągnąć swoje zależności do katalogu docelowego, użyj wtyczki zależności do skopiowania plików.
  • Jeśli chcesz pobrać zależności dla innego rodzaju przetwarzania, prawdopodobnie będziesz musiał wygenerować własną wtyczkę. Istnieją interfejsy API umożliwiające uzyskanie listy zależności i ich lokalizacji na dysku. Będziesz musiał wziąć to stąd ...

80
mvn install dependency:copy-dependencies 

Działa dla mnie z katalogiem zależności utworzonym w folderze docelowym. Lubię to!



31

Proste i eleganckie rozwiązanie w przypadku, gdy trzeba skopiować zależności do katalogu docelowego bez użycia innych faz maven (uważam to za bardzo przydatne podczas pracy z Vaadin).

Kompletny przykład pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-sources</phase>

                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>

                            <configuration>
                                <outputDirectory>${targetdirectory}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>
</project>

Następnie uruchomić mvn process-sources

Zależności pliku jar można znaleźć w /target/dependency


1
Wtyczka maven-dependency-plugin (cele „zależności kopiowania”, „rozpakuj”) nie jest obsługiwana przez m2e. :-(
PM

@Gobliinowie używają $ {project.build.directory} / lib zamiast $ {targetdirectory}
Divyang Shah

24

Jeśli chcesz to robić od czasu do czasu (a tym samym nie chcesz zmieniać POM), wypróbuj ten wiersz polecenia:

Zależność mvn: zależność kopiowania -DoutputDirectory = $ {project.build.directory} / lib

Pominięcie ostatniego argumentu powoduje umieszczenie zależności target/dependencies.


dzięki! jest to najprostszy sposób, aby po prostu skopiować biblioteki, które byłyby wymagane przez projekt do jakiegoś folderu, aby w razie potrzeby skopiować je gdzie indziej, np. projekt nie oparty na maven. Pamiętaj, że oczywiście możesz po prostu przekazać w folderze zakodowanym do użycia, jeśli chcesz, np.mvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Czy możesz to zrobić z pom.xml?
Gobliins,

24

Wypróbuj coś takiego:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
    <archive>
        <manifest>  
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>MainClass</mainClass>
        </manifest>
    </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

@Thomas Myślę, że tak maven clean install, to znajdziesz libwtarget
Searene

1
co musiałbym zrobić, aby skopiować tylko 1 zależność?
Alan Donizete

<classpathPrefix> lib / </classpathPrefix> bardzo mi pomogło. Dziękuję Ci!
Martin Pabst

Zastąpiłby installfazę process-resourcestak że zależności są kopiowane przed buildprzebiegów cel
Wiaczesław Cotruta

20

Wszystko czego potrzebujesz to następujący fragment kodu w pliku pom.xml build/plugins:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Powyższe będzie działać w packagefazie po uruchomieniu

mvn clean package

Zależności zostaną skopiowane do katalogu outputDirectory określonego we fragmencie, tj. libW tym przypadku.

Jeśli chcesz to robić tylko od czasu do czasu, nie są wymagane żadne zmiany w pliku pom.xml. Po prostu uruchom następujące polecenie:

mvn clean package dependency:copy-dependencies

Aby zastąpić domyślną lokalizację, czyli ${project.build.directory}/dependenciesdodaj właściwość System o nazwie outputDirectory, tj

    -DoutputDirectory=${project.build.directory}/lib

7

jeżeli

  • nie chcesz zmieniać pliku pom.xml
  • nie chcesz mieć zasięgu testu (np. junit.jar) ani podanych zależności (np. wlfullclient.jar)

oto, co dla mnie zadziałało:

Zależność instalacji mvn: zależność kopiowania -DincludeScope = środowisko wykonawcze -DoutputDirectory = cel / lib

5

Jeśli chcesz dostarczyć pakiet słoika aplikacji wraz ze wszystkimi jego zależnościami i niektórymi skryptami wywołującymi MainClass, spójrz na wtyczkę appassembler-maven-plugin .

Poniższa konfiguracja wygeneruje skrypty dla systemu Windows i Linux w celu uruchomienia aplikacji (z wygenerowaną ścieżką odwołującą się do wszystkich słoików zależności, pobierz wszystkie zależności (do folderu lib poniżej elementu docelowego / appassembler). Następnie można użyć wtyczki asemblera do spakowania całego katalog appassembler do pliku zip, który jest instalowany / wdrażany wraz ze słoikiem do repozytorium.

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>generate-jsw-scripts</id>
        <phase>package</phase>
        <goals>
          <goal>generate-daemons</goal>
        </goals>
        <configuration>
          <!--declare the JSW config -->
          <daemons>
            <daemon>
              <id>myApp</id>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <commandLineArguments>
                <commandLineArgument>start</commandLineArgument>
              </commandLineArguments>
              <platforms>
                <platform>jsw</platform>
              </platforms>              
            </daemon>
          </daemons>
          <target>${project.build.directory}/appassembler</target>
        </configuration>
      </execution>
      <execution>
        <id>assemble-standalone</id>
        <phase>integration-test</phase>
        <goals>
          <goal>assemble</goal>
        </goals>
        <configuration>
          <programs>
            <program>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <!-- the name of the bat/sh files to be generated -->
              <name>mymain</name>
            </program>
          </programs>
          <platforms>
            <platform>windows</platform>
            <platform>unix</platform>
          </platforms>
          <repositoryLayout>flat</repositoryLayout>
          <repositoryName>lib</repositoryName>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/archive.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin> 

Deskryptorem zestawu (w src / main / assembly) do spakowania direcotry jako zip byłby:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>



1

Wystarczy przeliterować to, co już zostało powiedziane w skrócie. Chciałem utworzyć wykonywalny plik JAR, który zawierał moje zależności wraz z moim kodem. To działało dla mnie:

(1) W pom, pod <build> <wtyczki>, zawarłem:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

(2) Uruchamianie zestawu kompilacji mvn: zestaw utworzył pożądany plik my-project-0.1-SNAPSHOT-jar-with-dependencies.jar w katalogu docelowym projektu.

(3) Uruchomiłem JAR z java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar


główna klasa nie znaleziona w (3)
Thomas

1

Jest to ciężkie rozwiązanie do osadzania dużych zależności, ale Maven's Assembly Plugin załatwia sprawę.

@ Odpowiedź bogatego sprzedawcy powinna zadziałać, chociaż w prostszych przypadkach potrzebujesz tylko tego fragmentu przewodnika użytkowania :

<project>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Twój przykład kodu nie rozwiązuje problemu, po prostu łączy wszystko w jeden plik JAR. Tak, wtyczka asemblera może zostać wykorzystana do osiągnięcia tego celu, ale nie w ten sposób.
Duncan Jones

Chociaż podczas dalszej lektury może odpowiadasz na ten komentarz .
Duncan Jones

minęło tak dużo czasu, że tak naprawdę nie pamiętam… a ponadto zacząłem zardzewieć od czasu, gdy skupiłem się na administracji Linuksem w mojej ostatniej firmie - ale dziękuję za opinie!
RubyT TuesdayDONO

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.