[java] Maven이 의존성을 타겟 / lib에 복사하도록 강제한다.



7 Answers

가장 좋은 방법은 원하는 것을 따라 달라집니다.

  • 종속성을 WAR 또는 EAR 파일로 묶으려면 프로젝트의 패키징 유형을 EAR 또는 WAR로 설정하기 만하면됩니다. Maven은 의존성을 올바른 위치에 묶을 것이다.
  • 모든 종속성과 함께 코드를 포함하는 JAR 파일을 작성하려면 assembly 플러그인과 함께 jar-with-dependencies 설명자를 사용하십시오. Maven은 모든 클래스와 모든 의존성을 가진 클래스로 구성된 완전한 JAR 파일을 생성 할 것이다.
  • 의존성을 대화식으로 대상 디렉토리로 끌어 오려면 dependency 플러그인을 사용하여 파일을 복사하십시오.
  • 다른 유형의 처리를 위해 종속성을 가져 오려면 자체 플러그인을 생성해야 할 것입니다. 의존성 목록과 그 위치를 디스크에 저장하는 API가 있습니다. 거기에서 가져 가야 할 것입니다 ...
Question

내 프로젝트의 런타임 종속성을 target/lib 폴더로 복사하려면 어떻게해야합니까?

지금 당장은 mvn clean installtarget 폴더에 프로젝트의 jar 파일 만 포함되어 있지만 런타임 의존성은 포함되어 있지 않습니다.




무거운 의존성을 포함하기위한 무거운 솔루션이지만 Maven의 Assembly Plugin 은 나에게 트릭입니다.

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



가정

  • 당신은 pom.xml을 바꾸고 싶지 않다.
  • 테스트 스코프 (예 : junit.jar) 또는 제공된 종속성 (예 : wlfullclient.jar)을 원하지 않습니다.

여기 나를 위해 일한 것은 없습니다 :

mvn install dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/lib






응용 프로그램 jar의 번들을 모든 종속 항목과 MainClass를 호출하는 일부 스크립트와 함께 전달하려면 appassembler-maven-plugin .

다음 구성은 Window 및 Linux 용 스크립트를 생성하여 모든 종속성 jar를 참조하는 생성 된 경로를 사용하여 모든 종속성을 target / appassembler 아래의 lib 폴더로 다운로드합니다. assembly 을 사용하여 전체 패키지를 패키지화 할 수 있습니다 appassembler 디렉토리를 jar 파일과 함께 저장소에 설치 / 배치 된 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를 zip으로 패키징하는 어셈블리 디스크립터 (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>



가끔이 작업을 수행하려는 경우 (따라서 POM을 변경하지 않으려는 경우)이 명령 줄을 사용해보십시오.

mvn dependency:copy-dependencies -DoutputDirectory=${project.build.directory}/lib

마지막 인수 를 생략하면 종속성이 target/dependencies 배치됩니다.




<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.edge</groupId>
  <artifactId>STORM2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>STORM2</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
   <profiles>

  </profiles>
<build>
    <plugins>   
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
             <configuration>
                <archive>
                <manifest>
                <mainClass>com.edge.STORM2.LogAnalyserStorm</mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
          </plugin>

    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>
  </dependencies>
</project>

이것은 내 , 내가 뭔가를 놓친 건가? 생성 된 jar-with 의존성은 lib 클래스 나 jar를 포함하지 않습니다.




Shade Plugin 을 사용하여 모든 타사 종속성을 묶을 수있는 uber jar를 만들 수 있습니다.




Related