buộc Maven sao chép phụ thuộc vào mục tiêu / lib


252

Làm cách nào để có được các phụ thuộc thời gian chạy dự án của tôi được sao chép vào target/libthư mục?

Vì nó là ngay bây giờ, sau khi mvn clean installcác targetthư mục chỉ chứa jar của dự án của tôi, nhưng không ai trong số các phụ thuộc thời gian chạy.


Tại sao bạn cần điều này? Loại dự án maven của bạn là gì? bình?
Alexandre Victoor

Loại dự án maven của tôi là JAR. Tôi cần điều này bởi vì có rất nhiều phụ thuộc và tôi đang cố gắng triển khai jar như một thực thi.
Michael

2
Thận trọng với các hội đồng - nếu bạn có các gói / lớp chồng chéo giữa các dep, bạn có thể sẽ có một thời gian tồi tệ.
demaniak

Câu trả lời:


260

Điều này làm việc cho tôi:

<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
Nếu bạn muốn điều này xảy ra mọi lúc, hãy xóa các trình bao bọc <profile> ... <profile> và đặt thẻ <build> ngay dưới <dự án>
Dan Halbert

3
@Georgy điều này không làm hỏng các lọ trong lib /, nhưng bao gồm các lớp trong dự án được biên dịch
Midhat

5
Điều này là tốt, nhưng nó cũng sao chép phụ thuộc kiểm tra. Tôi thêm vào cho mình excludeScopetùy chọn ( maven.apache.org/plugins/maven-dependency-plugin/ ám ).
Alfonso Nishikawa

Hoạt động tốt nhưng không bắt buộc phải đặt thẻ xây dựng bên trong thẻ hồ sơ.
Julien BRENELIERE

2
Lưu ý: <excludeScope>test</excludeScope>đi vào bên trong configurationnút.
Jesse Chisholm

84

Cách tiếp cận tốt nhất phụ thuộc vào những gì bạn muốn làm:

  • Nếu bạn muốn bó các phụ thuộc của mình vào tệp WAR hoặc EAR, thì chỉ cần đặt loại bao bì của dự án của bạn thành EAR hoặc WAR. Maven sẽ bó các phụ thuộc vào đúng vị trí.
  • Nếu bạn muốn tạo một tệp JAR bao gồm mã của bạn cùng với tất cả các phụ thuộc của bạn, thì hãy sử dụng plugin lắp ráp với bộ mô tả jar-with-Depencies . Maven sẽ tạo một tệp JAR hoàn chỉnh với tất cả các lớp của bạn cộng với các lớp từ bất kỳ phụ thuộc nào.
  • Nếu bạn chỉ muốn kéo các phụ thuộc của mình vào thư mục đích một cách tương tác, thì hãy sử dụng plugin phụ thuộc để sao chép các tệp của bạn vào.
  • Nếu bạn muốn sử dụng các phụ thuộc cho một số loại xử lý khác, thì có lẽ bạn sẽ cần phải tạo plugin của riêng mình. Có các API để lấy danh sách các phụ thuộc và vị trí của chúng trên đĩa. Bạn sẽ phải lấy nó từ đó ...

80
mvn install dependency:copy-dependencies 

Hoạt động với tôi với thư mục phụ thuộc được tạo trong thư mục đích. Thích nó!


35

Hãy xem plugin phụ thuộc Maven , cụ thể, mục tiêu phụ thuộc: sao chép phụ thuộc . Hãy xem ví dụ dưới tiêu đề Phụ thuộc: sao chép phụ thuộc mojo . Đặt thuộc tính cấu hình outputDirectory thành $ {Dựair} / target / lib (Tôi tin rằng, bạn sẽ phải kiểm tra).

Hi vọng điêu nay co ich.


15
Ngoài ra, bạn có thể sử dụng $ {project.build.directory} / lib thay vì $ {Dựair} / target / lib
Cuga

31

Một giải pháp đơn giản và thanh lịch cho trường hợp người ta cần sao chép các phụ thuộc vào thư mục đích mà không sử dụng bất kỳ giai đoạn nào khác của maven (Tôi thấy điều này rất hữu ích khi làm việc với Vaadin).

Ví dụ pom hoàn chỉnh:

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

Sau đó chạy mvn process-sources

Các phụ thuộc tệp jar có thể được tìm thấy trong /target/dependency


1
maven-phụ thuộc-plugin (mục tiêu "phụ thuộc sao chép", "giải nén") không được hỗ trợ bởi m2e. :-(
PM

@Gobliins sử dụng $ {project.build.directory} / lib thay vì $ {targetdirectory}
Divyang Shah

24

Nếu bạn muốn làm điều này trên cơ sở không thường xuyên (và do đó không muốn thay đổi POM của bạn), hãy thử dòng lệnh này:

phụ thuộc mvn: phụ thuộc bản sao -DoutputDirectory = $ {project.build.directory} / lib

Nếu bạn bỏ qua đối số cuối cùng , các phụ thuộc được đặt vào target/dependencies.


cảm ơn! đây là cách dễ nhất để sao chép các lib mà dự án sẽ yêu cầu vào một thư mục ở đâu đó để bạn có thể sao chép chúng ở một nơi khác nếu cần, ví dụ như một dự án không dựa trên maven. Lưu ý rằng tất nhiên bạn chỉ có thể vượt qua trong một thư mục mã hóa cứng để sử dụng nếu bạn thích, ví dụmvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Bạn có thể làm điều đó ngoài pom.xml không?
Yêu tinh

24

Hãy thử một cái gì đó như thế này:

<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 Tôi nghĩ đó là maven clean install, sau đó bạn sẽ tìm thấy libtrongtarget
Searene

1
Tôi phải làm gì để chỉ sao chép 1 phụ thuộc?
Alan Donizete

<classpathPrefix> lib / </ classpathPrefix> đã giúp tôi rất nhiều. Cảm ơn bạn!
Martin Pabst

Sẽ thay thế installpha bằng process-resourcesđể các phụ thuộc được sao chép trước khi buildmục tiêu chạy
Vyacheslav Cotruta

20

Tất cả những gì bạn cần là đoạn mã sau trong 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>

Ở trên sẽ chạy trong packagegiai đoạn khi bạn chạy

mvn clean package

Và các phụ thuộc sẽ được sao chép vào outputDirectory được chỉ định trong đoạn mã, tức là lib trong trường hợp này.

Nếu bạn chỉ muốn làm điều đó đôi khi, thì không cần thay đổi đối với pom.xml. Đơn giản chỉ cần chạy như sau:

mvn clean package dependency:copy-dependencies

Để ghi đè vị trí mặc định, đó là ${project.build.directory}/dependencies, thêm thuộc tính Hệ thống có tên outputDirectory, nghĩa là

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

7

giả sử

  • bạn không muốn thay đổi tệp pom.xml
  • bạn không muốn kiểm tra phạm vi (ví dụ: Junit.jar) hoặc được cung cấp các phụ thuộc (ví dụ: wlfullclient.jar)

đây là những gì làm việc cho tôi:

mvn cài đặt phụ thuộc: sao chép phụ thuộc -DincludeScope = runtime -DoutputDirectory = target / lib

5

Nếu bạn muốn phân phối một gói ứng dụng của mình, cùng với tất cả các phụ thuộc của nó và một số tập lệnh để gọi MainClass, hãy xem appassembler-maven-plugin .

Cấu hình sau sẽ tạo tập lệnh cho Window và Linux để khởi chạy ứng dụng (với đường dẫn được tạo tham chiếu tất cả các tệp phụ thuộc, tải xuống tất cả các phụ thuộc (vào thư mục lib bên dưới target / appassembler). Sau đó, plugin lắp ráp có thể được sử dụng để đóng gói toàn bộ thư mục appassembler vào một zip được cài đặt / triển khai cùng với jar vào kho lưu trữ.

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

Bộ mô tả lắp ráp (theo src / main / assembly) để đóng gói direcotry dưới dạng zip sẽ là:

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

2

Nếu bạn thực hiện dự án của mình một loại chiến tranh hoặc tai maven sẽ sao chép các phụ thuộc.



1

Chỉ cần đánh vần những gì đã được nói ngắn gọn. Tôi muốn tạo một tệp JAR thực thi bao gồm các phụ thuộc của tôi cùng với mã của tôi. Điều này làm việc cho tôi:

(1) Trong pom, trong <build> <plugin>, tôi đã bao gồm:

<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) Chạy lắp ráp biên dịch mvn: lắp ráp đã tạo ra my-project-0.1-SNAPSHOT-jar-with-Depencies.jar mong muốn trong thư mục đích của dự án.

(3) Tôi đã chạy JAR với java -jar my-project-0.1-SNAPSHOT-jar-with-Depencies.jar


không tìm thấy lớp chính trong (3)
Thomas

1

Đó là một giải pháp nặng nề để nhúng các phụ thuộc nặng nề, nhưng Plugin hội của Maven thực hiện thủ thuật cho tôi.

@ Câu trả lời của Rich Seller sẽ hoạt động, mặc dù đối với những trường hợp đơn giản hơn, bạn chỉ cần trích đoạn này từ hướng dẫn sử dụng :

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

Ví dụ mã của bạn không giải quyết được vấn đề, nó chỉ gói mọi thứ vào một JAR duy nhất. Có, plugin lắp ráp có thể được sử dụng để đạt được mục tiêu này, nhưng không phải như thế này.
Duncan Jones

Mặc dù, khi đọc thêm, có thể bạn đang phản hồi bình luận này .
Duncan Jones

đã quá lâu đến nỗi tôi không thực sự nhớ đến cộng với việc tôi đã trở nên khá thô lỗ kể từ khi tập trung vào quản trị Linux tại công ty cuối cùng của mình - nhưng cảm ơn bạn đã phản hồi!
RubyTuesdayDONO

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.