Maven'i bağımlılıkları hedefe / lib'e kopyalamaya zorla


252

Projemin çalışma zamanı bağımlılıklarını target/libklasöre nasıl kopyalayabilirim?

Sonra, şu anda olduğu gibi klasörü yalnızca benim projenin kavanoz, ancak çalışma zamanı bağımlılıkları hiçbirini içermez.mvn clean installtarget


Buna ne için ihtiyacın var ? Maven projenizin türü nedir? kavanoz?
Alexandre Victoor

Maven projemin türü JAR. Buna ihtiyacım var çünkü çok fazla bağımlılık var ve jar'ı yürütülebilir olarak dağıtmaya çalışıyorum.
Michael

2
Montajlara dikkat edin - Depolar arasında çakışan paketler / sınıflar varsa, muhtemelen kötü bir zamanınız olacaktır.
demaniak

Yanıtlar:


260

Bu benim için çalışıyor:

<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
Bunun her zaman olmasını istiyorsanız, <profiles> ... <profile> sarmalayıcılarını kaldırın ve <build> etiketinin <project> 'un hemen altında olmasını sağlayın
Dan Halbert

3
@Georgy bu lib / kavanozları nazlı değil, ama derlenmiş projedeki sınıfları içerir
Midhat

5
Bu iyi, ama test bağımlılıklarını da kopyalıyor. Kendime excludeScopeseçeneği ekliyorum ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa

İyi çalışın, ancak oluşturma etiketini profil etiketlerinin içine yerleştirmek gerekmez.
Julien BRENELIERE

2
Not: düğümün <excludeScope>test</excludeScope>içine girer configuration.
Jesse Chisholm

84

En iyi yaklaşım, ne yapmak istediğinize bağlıdır:

  • Bağımlılıklarınızı bir WAR veya EAR dosyasına paketlemek istiyorsanız, projenizin paketleme türünü EAR veya WAR olarak ayarlayın. Maven bağımlılıkları doğru yerde toplar.
  • Tüm bağımlılıklarınızla birlikte kodunuzu içeren bir JAR dosyası oluşturmak istiyorsanız, derleme eklentisini bağımlılık yapan jar tanımlayıcıyla birlikte kullanın. Maven, tüm sınıflarınız artı herhangi bir bağımlılık sınıfından oluşan eksiksiz bir JAR dosyası oluşturur.
  • Bağımlılıklarınızı etkileşimli olarak hedef dizine çekmek istiyorsanız , dosyalarınızı kopyalamak için bağımlılık eklentisini kullanın.
  • Başka bir tür işlem için bağımlılıkları çekmek istiyorsanız, muhtemelen kendi eklentinizi oluşturmanız gerekir. Bağımlılıkların listesini ve diskteki konumlarını almak için API'ler vardır. Oradan götürmeniz gerekecek ...

80
mvn install dependency:copy-dependencies 

Hedef klasörde oluşturulan bağımlılıklar dizini ile benim için çalışır. Beğendim!



31

Bir başka maven fazı kullanmadan bağımlılıkları bir hedef dizine kopyalamak gerektiğinde basit ve zarif bir çözüm (Vaadin ile çalışırken bunu çok yararlı buldum).

Komple pom örneği:

<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>

O zaman koş mvn process-sources

Jar dosyası bağımlılıkları şurada bulunabilir: /target/dependency


1
maven-bağımlılığı-eklentisi ("kopya bağımlılıkları" hedefleri, "paketi aç") m2e tarafından desteklenmez. :-(
PM

@Gobliins, $ {targetdirectory} yerine $ {project.build.directory} / lib kullanıyor
Shah

24

Bunu ara sıra yapmak istiyorsanız (ve böylece POM'nizi değiştirmek istemiyorsanız), şu komut satırını deneyin:

mvn bağımlılığı: copy-bağımlılıkları -DoutputDirectory = $ {project.build.directory} / lib

Son argümanı atlarsanız, bağımlılıklar yerleştirilir target/dependencies.


Teşekkürler! Bu, bir projenin gerektireceği kütüphaneleri bir yere bir klasöre kopyalamanın en kolay yoludur, böylece gerekirse başka bir yere kopyalayabilirsiniz, örneğin maven tabanlı olmayan bir proje. Tabii ki isterseniz sadece kullanmak için sabit kodlu bir klasöre geçebilirsiniz, örneğinmvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Pom.xml'den yapabilir misin?
Gobliins

24

Bunun gibi bir şey deneyin:

<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>

Bence bu @Thomas maven clean install, o zaman bulacaksınız libiçindetarget
Searene

1
sadece 1 bağımlılığı kopyalamak için ne yapmam gerekir?
Alan Donizete

<classpathPrefix> lib / </classpathPrefix> bana çok yardımcı oldu. Teşekkür ederim!
Martin Pabst

Yerini alacak installolan faz process-resourcesbağımlılıkları önce kopyalanan böylece buildgol ishal
Vyacheslav Cotruta

20

İhtiyacınız olan tek şey pom.xml'lerin içindeki aşağıdaki snippet'tir 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>

Yukarıda çalıştırdığınızda yukarıdaki packageaşama çalışacaktır

mvn clean package

Ve bağımlılıklar snippet'te belirtilen outputDirectory öğesine, yani libbu durumda kopyalanacaktır .

Bunu yalnızca ara sıra yapmak istiyorsanız, pom.xml dosyasında herhangi bir değişiklik yapılması gerekmez. Sadece aşağıdakileri çalıştırın:

mvn clean package dependency:copy-dependencies

Varsayılan konumu geçersiz kılmak için , yani ${project.build.directory}/dependenciesadlı bir System özelliği ekleyin;outputDirectory

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

7

Diyelim

  • pom.xml dosyasını değiştirmek istemezsiniz
  • test kapsamının (ör. junit.jar) veya sağlanan bağımlılıkların (örn. wlfullclient.jar) olmasını istemezsiniz

İşte benim için işe yarayan şey:

mvn yükleme bağımlılığı: kopya bağımlılıkları -DincludeScope = runtime -DoutputDirectory = target / lib

5

MainClass'ı çağırmak için tüm bağımlılıkları ve bazı komut dosyalarıyla birlikte uygulama kavanozunuzun bir paketini sunmak istiyorsanız, appassembler-maven-eklentisine bakın .

Aşağıdaki yapılandırma) hedef / appassembler altında bir lib klasörüne tüm bağımlılıklarını (indirmek, tüm bağımlılık kavanozları başvuran Oluşturulan bir yol ile (uygulamayı başlatmak için Pencere ve Linux için komut dosyaları oluşturur. Montaj eklentisi sonra tüm paketlemek için kullanılabilir appassembler dizini depoya kavanoz ile birlikte kurulan / dağıtılan bir zip.

  <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> 

Direcotry'i bir zip olarak paketlemek için montaj tanımlayıcısı (src / main / assembly):

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

2

Projenizi bir savaş ya da kulak tipi yaparsanız bağımlılıklar kopyalar.



1

Sadece kısaca söylenenleri hecelemek için. Kodlarımla birlikte bağımlılıklarımı içeren yürütülebilir bir JAR dosyası oluşturmak istedim. Bu benim için çalıştı:

(1) Pom'da, <build> <plugins> altına dahil ettim:

<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) Çalışan mvn derleme montajı: montaj projenin hedef dizininde istenen my-project-0.1-SNAPSHOT-jar-with-dependsencies.jar üretti.

(3) JAR'ı java -jar my-project-0.1-SNAPSHOT-jar-bağımlılıklarla çalıştırdım.jar


ana sınıf bulunamadı (3)
Thomas

1

Ağır bağımlılıkları yerleştirmek için ağır bir çözüm, ama Maven'in Meclis Eklentisi benim için hile yapıyor.

@ Rich Seller'in cevabı işe yarayacaktır, ancak daha basit durumlar için sadece kullanım kılavuzundan bu alıntıya ihtiyacınız vardır :

<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>

Kod örneğiniz sorunu çözmez, her şeyi tek bir JAR'da toplar. Evet, montaj eklentisi bu hedefe ulaşmak için kullanılabilir, ancak böyle değil.
Duncan Jones

Her ne kadar, daha fazla okumada, belki de bu yoruma cevap veriyorsunuz .
Duncan Jones

o kadar uzun zaman oldu ki gerçekten hatırlamıyorum… artı son firmamda Linux yönetimine odaklandığımdan beri oldukça paslı oldum - ama geri bildirim için teşekkürler!
RubyTuesdayDONO

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.