บังคับให้ Maven คัดลอกการอ้างอิงไปยังเป้าหมาย / lib


252

ฉันจะคัดลอกการอ้างอิงแบบรันไทม์ของโครงการไปยังtarget/libโฟลเดอร์ได้อย่างไร

มันเป็นอยู่ในขณะนี้หลังจากโฟลเดอร์มีเพียงขวดโครงการของฉัน แต่ไม่มีการอ้างอิงรันไทม์mvn clean installtarget


ทำไมคุณต้องการสิ่งนี้ โครงการ maven ของคุณคืออะไร? ไห
Alexandre Victoor

ประเภทของโครงการ maven ของฉันคือ JAR ฉันต้องการสิ่งนี้เพราะมีการอ้างอิงจำนวนมากและฉันพยายามปรับใช้ jar เพื่อให้สามารถเรียกใช้งานได้
ไมเคิล

2
ข้อควรระวังเกี่ยวกับแอสเซมบลี - ถ้าคุณมีแพคเกจ / คลาสที่ทับซ้อนกันระหว่าง deps คุณอาจจะมีเวลาไม่ดี
demaniak

คำตอบ:


260

สิ่งนี้ใช้ได้กับฉัน:

<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
หากคุณต้องการให้สิ่งนี้เกิดขึ้นตลอดเวลาให้ลบ <profiles> ... <profile> wrappers และทำให้แท็ก <build> อยู่ภายใต้ <project>
Dan Halbert

3
@Georgy นี้ไม่อายไหใน lib / แต่รวมถึงการเรียนในโครงการรวบรวม
Midhat

5
นี่เป็นสิ่งที่ดี แต่มันก็เป็นการคัดลอกการทดสอบอ้างอิง ฉันเพิ่มตัวexcludeScopeเลือกให้กับตัวเอง( maven.apache.org/plugins/maven-dependency-plugin/ … )
อัลฟองโซนิชิกาว่า

ทำงานได้ดี แต่ไม่จำเป็นต้องวางแท็กบิลด์ไว้ในแท็กโปรไฟล์
Julien BRENELIERE

2
หมายเหตุ: <excludeScope>test</excludeScope>เข้าไปในconfigurationโหนด
Jesse Chisholm

84

วิธีที่ดีที่สุดขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ:

  • หากคุณต้องการรวมการพึ่งพาของคุณไว้ในไฟล์ WAR หรือ EAR ให้ตั้งค่าประเภทบรรจุภัณฑ์ของโครงการเป็น EAR หรือ WAR Maven จะรวมการพึ่งพาลงในตำแหน่งที่ถูกต้อง
  • หากคุณต้องการที่จะสร้างไฟล์ JAR ที่มีรหัสของคุณพร้อมกับการอ้างอิงของคุณทั้งหมดแล้วใช้ประกอบปลั๊กอินกับขวดที่มีการอ้างอิงบ่ง Maven จะสร้างไฟล์ JAR ที่สมบูรณ์พร้อมกับคลาสทั้งหมดของคุณรวมถึงคลาสจากการพึ่งพาใด ๆ
  • หากคุณต้องการเพียงแค่ดึงการอ้างอิงของคุณลงในไดเรกทอรีเป้าหมายแบบโต้ตอบแล้วใช้ปลั๊กอินการพึ่งพาเพื่อคัดลอกไฟล์ของคุณ
  • หากคุณต้องการดึงการพึ่งพาสำหรับการประมวลผลประเภทอื่น ๆ คุณอาจต้องสร้างปลั๊กอินของคุณเอง มี API เพื่อรับรายการการพึ่งพาและตำแหน่งของพวกเขาบนดิสก์ คุณจะต้องเอามันจากที่นั่น ...

80
mvn install dependency:copy-dependencies 

ทำงานได้สำหรับฉันด้วยไดเรกทอรีการอ้างอิงที่สร้างขึ้นในโฟลเดอร์เป้าหมาย ชอบมัน!


35

ลองดูที่เป็นปลั๊กอินพึ่งพา Mavenเฉพาะที่พึ่งพา: เป้าหมายของการคัดลอกอ้างอิง ลองดูที่ตัวอย่างภายใต้หัวข้อพึ่งพา: คัดลอกอ้างอิง Mojo ตั้งค่าคุณสมบัติการกำหนดค่าoutputDirectoryเป็น $ {basedir} / target / lib (ฉันเชื่อว่าคุณจะต้องทดสอบ)

หวังว่านี่จะช่วยได้


15
หรือคุณสามารถใช้ $ {project.build.directory} / lib แทน $ {basedir} / target / lib
Cuga

31

ทางออกที่ง่ายและสง่างามสำหรับกรณีที่ต้องคัดลอกการอ้างอิงไปยังไดเรกทอรีเป้าหมายโดยไม่ใช้เฟส maven อื่น ๆ (ฉันพบว่ามีประโยชน์มากเมื่อทำงานกับ Vaadin)

ทำตัวอย่าง 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>

จากนั้นเรียกใช้ mvn process-sources

การอ้างอิงไฟล์ jar สามารถพบได้ใน /target/dependency


1
maven-dependency-plugin (เป้าหมาย "copy-dependencies", "unpack") ไม่รองรับ m2e :-(
น.

@Gobliins ใช้ $ {project.build.directory} / lib แทน $ {targetdirectory}
Divyang Shah

24

หากคุณต้องการทำเช่นนี้เป็นครั้งคราว (และไม่ต้องการเปลี่ยน POM ของคุณ) ลองใช้บรรทัดคำสั่งนี้:

การพึ่งพา mvn: การคัดลอกอ้างอิง -DoutputDirectory = $ {project.build.directory} / lib

หากคุณละเว้นอาร์กิวเมนต์สุดท้าย , dependences target/dependenciesที่มีอยู่ใน


ขอบคุณ! นี่เป็นวิธีที่ง่ายที่สุดในการคัดลอก libs ที่จะต้องใช้ในโครงการลงในโฟลเดอร์ที่ใดที่หนึ่งเพื่อให้คุณสามารถคัดลอกไปที่อื่นได้ถ้าจำเป็นเช่นโครงการที่ไม่ใช้ Maven โปรดทราบว่าแน่นอนคุณสามารถส่งต่อในโฟลเดอร์ hardcoded เพื่อใช้งานได้เช่นmvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

คุณสามารถทำได้จาก pom.xml หรือไม่
Gobliins

24

ลองสิ่งนี้:

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

@ โทมัสฉันคิดว่ามันmaven clean installแล้วคุณจะพบlibในtarget
เซียรี

1
ฉันต้องทำอะไรเพื่อคัดลอกการพึ่งพาเพียง 1 ครั้ง
Alan Donizete

<classpathPrefix> lib / </classpathPrefix> ช่วยฉันได้มาก ขอบคุณ!
Martin Pabst

จะแทนที่installเฟสด้วยprocess-resourcesเพื่อให้การอ้างอิงถูกคัดลอกก่อนที่buildเป้าหมายจะทำงาน
Vyacheslav Cotruta

20

เพียงคุณมีตัวอย่างต่อไปนี้ภายใน 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>

ข้างต้นจะทำงานในpackageเฟสเมื่อคุณเรียกใช้

mvn clean package

และการอ้างอิงจะถูกคัดลอกไปยัง outputDirectory ที่ระบุไว้ในตัวอย่างเช่น libในกรณีนี้

หากคุณต้องการทำเช่นนั้นเป็นครั้งคราวไม่จำเป็นต้องทำการเปลี่ยนแปลง pom.xml เรียกใช้สิ่งต่อไปนี้:

mvn clean package dependency:copy-dependencies

เพื่อแทนที่ตำแหน่งเริ่มต้นซึ่งก็คือ${project.build.directory}/dependenciesเพิ่มคุณสมบัติของระบบชื่อoutputDirectoryเช่น

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

7

เผื่อว่า

  • คุณไม่ต้องการแก้ไข pom.xml
  • คุณไม่ต้องการขอบเขตการทดสอบ (เช่น junit.jar) หรือการอ้างอิงที่ให้ไว้ (เช่น wlfullclient.jar)

นี่คือสิ่งที่ทำงานสำหรับฉัน:

mvn ติดตั้งการพึ่งพา: copy-dependencies -DincludeScope = runtime -DoutputDirectory = target / lib

5

หากคุณต้องการที่จะส่งมอบกำของขวดใบสมัครของคุณร่วมกับทุกการอ้างอิงและบางสคริปต์เพื่อเรียก MainClass, ดูที่appassembler-Maven ปลั๊กอิน

การกำหนดค่าต่อไปนี้จะสร้างสคริปต์สำหรับ Window และ Linux เพื่อเรียกใช้แอปพลิเคชัน (ด้วยพา ธ ที่สร้างขึ้นที่อ้างอิงถึงไหทั้งหมด, ดาวน์โหลดการพึ่งพาทั้งหมด (ลงในโฟลเดอร์ lib ด้านล่าง target / appassembler) จากนั้นปลั๊กอินแอสเซมบลี appassembler ไดเรกทอรีเพื่อ zip ซึ่งติดตั้ง / ปรับใช้พร้อมกับ jar ไปยังที่เก็บ

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

ตัวอธิบายแอสเซมบลี (ใน src / main / assembly) เพื่อจัดแพคเกจ direcotry เป็น zip จะเป็น:

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

2

ถ้าคุณทำให้โครงการของคุณเป็นสงครามหรือประเภทหูฟังจะคัดลอกการอ้างอิง



1

เพียงเสาะหาสิ่งที่ได้พูดไปแล้วโดยย่อ ฉันต้องการสร้างไฟล์ JAR ที่รันได้ซึ่งรวมถึงการพึ่งพาของฉันพร้อมกับรหัสของฉัน สิ่งนี้ใช้ได้กับฉัน:

(1) ใน pom ภายใต้ <build> <plugins> ฉันรวม:

<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) การรันแอสเซมบลี mvn คอมไพล์: แอสเซมบลีที่ผลิต my-project-0.1-SNAPSHOT-jar-with-dependencies.jar ที่ต้องการในไดเรกทอรีเป้าหมายของโครงการ

(3) ฉันรัน JAR ด้วย java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar


ชั้นหลักไม่พบใน (3)
โทมัส

1

มันเป็นทางออกที่หนักหนาสาหัสสำหรับการฝังการพึ่งพาอย่างมาก แต่ M Assemblyของ Maven ทำหน้าที่หลอกฉัน

@ คำตอบของผู้ขาย Richควรใช้งานได้แม้ว่าในกรณีที่ง่ายกว่าคุณควรจะต้องมีข้อความที่ตัดตอนมาจากคู่มือการใช้งานนี้ :

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

ตัวอย่างรหัสของคุณไม่สามารถแก้ปัญหาได้เพียงรวมทุกอย่างไว้ใน JAR เดียว ใช่ปลั๊กอินแอสเซมบลีสามารถใช้เพื่อให้บรรลุเป้าหมายนี้ แต่ไม่ชอบสิ่งนี้
Duncan Jones

แม้ว่าในการอ่านเพิ่มเติมบางทีคุณอาจจะตอบกลับความคิดเห็นนี้
Duncan Jones

มันนานมากแล้วที่ฉันจำไม่ได้จริงๆ…รวมทั้งฉันก็ค่อนข้างเป็นสนิมตั้งแต่มุ่งเน้นไปที่การบริหาร Linux ที่ บริษัท สุดท้ายของฉัน - แต่ขอบคุณสำหรับความคิดเห็น!
RubyTuesdayDONO

0

หากคุณมีปัญหาเกี่ยวกับการขึ้นต่อกันที่ไม่ปรากฏในไฟล์ WEB-INF / lib เมื่อทำงานบนเซิร์ฟเวอร์ Tomcat ใน Eclipse ให้ดูที่:

ClassNotFoundException DispatcherServlet เมื่อเรียกใช้ Tomcat (การอ้างอิง Maven ไม่ได้คัดลอกไปยัง wtpwebapps)

คุณเพียงแค่ต้องเพิ่ม Maven Dependencies ใน Properties ของโครงการ> Deployment Assembly

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.