Maven으로 파일을 복사하는 모범 사례


194

Maven2를 사용하여 dev 환경에서 dev-server 디렉토리로 복사하려는 구성 파일과 다양한 문서가 있습니다. 이상하게도 Maven은이 작업에서 강력 해 보이지 않습니다.

옵션 중 일부 :

  • Maven에서 간단한 복사 작업 사용
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
  • Ant 플러그인을 사용하여 Ant 에서 사본 을 실행 하십시오 .

    • 일반적으로 jar 유형 인 POM의 "주요"아티팩트와 함께 zip 유형의 아티팩트를 구성한 다음 저장소에서 대상 디렉토리로 해당 아티팩트 를 압축 해제 하십시오.

    • 아래에 언급 된 것처럼 maven-resources 플러그인.

    • Maven Assembly 플러그인-간단하고 "전통적으로"일하고 싶을 때 많은 수동 정의가 필요한 것 같습니다.

    • 이 페이지 는 플러그인을 빌드하여 복사하는 방법도 보여줍니다!

    • 아래에 언급 된 것처럼 maven-upload 플러그인.

    • 받는다는 - 종속성 - 플러그인 과 사본 아래에 언급 한 바와 같이.


이 모든 것이 불필요하게 임시로 보입니다. Maven은 번거롭지 않고 이러한 표준 작업을 수행하는 데 탁월합니다.

어떤 충고?


2
Maven은 단계별로 수명주기라는 아이디어를 기반으로하며, 임의의 파일을 원격 서버 작업에 복사하는 것은 실제로 적합하지 않습니다. 항상 프로젝트 전체를 생각하십시오.
— André

3
"이 모든 것은 불필요하게 임시로 보인다 : Maven은 번거롭고 귀찮게하지 않고 이러한 표준 작업을 수행하는 데 뛰어나야한다." 아티팩트가 전쟁 / 귀인 경우화물 플러그인 (cargo.codehaus.org/Maven2+plugin#Maven2plugin-get…)을 사용하는 것만 큼 간단합니다. 설명하는 내용은 표준 Java 응용 프로그램 컨테이너 배포가 아니라 배포를 수행하는 방법에 따라 매우 구체적으로 들립니다. Maven은 실제 서버에 대한 배포 시간 활동을 처리하도록 설계되지 않았습니다. 활동을 빌드 / 개발하는 데 더 적합합니다.
— whaley

67
@ André : 그 주장이 계속해서 들리지만 미안합니다. BS입니다. 프로젝트 전체를 생각하는 데 아무런 문제가 없지만 괜찮은 빌드 시스템의 일부는 파일 복사와 같은 직접적인 방법으로 작업 X를 달성 할 수있는 기능이어야하며 Maven은 그렇게 할 수 없습니다. 최근에 너무 많은 프로젝트가 빌드-스크립트-코드-패러다임 (Gradle, SBT 또는 Buildr)을 포용하는 이유가 있습니다.
— Matthias

아티팩트 를 빌드 하고 지정된 아티팩트 를 배치 하기 위해 pom.xml을 사용하는 것이 좋습니다 .
— Thorbjørn Ravn Andersen

위의 모든 제안으로 여전히 다른 프로젝트 / 인공물에서 특정 파일을 maven 프로젝트로 복사 할 수없는 것 같습니다. jar가되는 이슈에 src / main / folder 아래에 일부 파일이 있고 dependency-copy maven 플러그인을 사용해 보았지만 복사 할 파일을 말할 수있는 방법을 찾지 못하여 전체 jar를 얻습니다. 항상 조립품 파일에 파일. 여기에 다른 모든 제안, 자원처럼, 내가 프로젝트 내부의 자원보다는 이슈를 지정할 수 있도록하지 않는 것
— 알렉상드르 Thenorio

답변:


120

Antrun 플러그인에서 부끄러워하지 마십시오. 일부 사람들은 Ant와 Maven이 반대에 있다고 생각하는 경향이 있기 때문에 그렇지 않습니다. 피할 수없는 일회성 사용자 정의를 수행해야하는 경우 복사 작업을 사용하십시오.

<project>
  [...]
  <build>
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>deploy</phase>
            <configuration>
              <tasks>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

이 질문에 대답하면서, 나는 당신이 요구 한 것에 대한 세부 사항에 초점을 맞추고 있습니다. 파일을 어떻게 복사합니까? 질문과 변수 이름은 "서버 프로비저닝을 다루는 더 좋은 방법이 있습니까?"와 같은 더 큰 질문으로 이어집니다. Maven을 빌드 시스템으로 사용하여 배치 가능한 아티팩트를 생성 한 다음 별도의 모듈 또는 다른 곳에서 이러한 사용자 정의를 수행하십시오. 빌드 환경을 조금 더 공유 한 경우 더 나은 방법이있을 수 있습니다. 여러 서버를 프로비저닝하는 플러그인이 있습니다. 서버 루트에 압축이 풀린 어셈블리를 첨부 할 수 있습니까? 어떤 서버를 사용하고 있습니까?

다시 한 번 더 나은 방법이 있다고 확신합니다.


작업 설명자가 이제 더 이상 사용되지 않습니까?
— Matt

3
@Matt 예, task이제 매개 변수는 더 이상 사용되지 않습니다 ( Antrun Plugin ). target대신 (1.5 이후) 사용해야 합니다. 불행히도 이것을 혼합하는 예제가 있습니다. 예를 들어 target매개 변수 및 version<1.5.
— cuh

이것이 어떻게 받아 들여질 수 있습니까? 복사를 단순하게 만들기 위해 maven에 대한 변경 요청이 있어야합니다.
— Wolfgang Fahl

137
<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include> **/*.properties</include>
            </includes>
        </resource>
    </resources>
    ...
</build>

@Peter에게 감사드립니다. 이제는 antrun 대신 resources-plugin copy-resources 목표를 사용합니다. 후자는 실제로 정의하기가 훨씬 간단하고 직관적이지만 모든 Maven 사용자 정의 속성 (<properties> 섹션에 정의 됨)을 antrun으로 전달할 수 없으므로 (version 1.3) resources-plugin으로 전환했습니다.
— Cornel Masson

2
나는 리소스 플러그인이 스킵 구성이 없다는 것을 깨달을 때까지 이것이 정답이라고 생각했습니다. 앤트 런이 갈 길입니다.
— Mike Post

건너 뛰기 프로파일을 만드는 것은 어렵지 않습니다. antrun을 사용하지 않았으므로 어느 것이 더 쉬운 지 알 수 없습니다
— Vivek Chavda

41

파일을 복사하려면 다음을 사용하십시오.

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>copy-resource-one</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>

                    <configuration>
                        <outputDirectory>${basedir}/destination-folder</outputDirectory>
                        <resources>
                            <resource>
                                <directory>/source-folder</directory>
                                <includes>
                                    <include>file.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
           </executions>
        </plugin>

하위 폴더가있는 폴더를 복사하려면 다음 구성을 사용하십시오.

           <configuration>
              <outputDirectory>${basedir}/target-folder</outputDirectory>
              <resources>          
                <resource>
                  <directory>/source-folder</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>  

Maven에서 필터링 은 문자열 보간을 참조하므로 변수 <filtering>를 사용하는 스크립트 파일과 같이 원하지 않는 변경을 피하기 위해 생략 ${...}합니다.
— GeroldBroser는 Monica를

20

maven 의존성 플러그인은 개미 작업을 좋아하는 많은 시간을 절약했습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>install-jar</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>...</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

의존성 : 복사 documentend이며, 압축 풀기와 같은 더 유용한 목표를 가지고있다.


3
나는 몇 년 동안 Ant를 사용하지 않았으며, 그렇게 간단한 일을 시작하고 싶지 않습니다. 이 답변에 감사드립니다.
— Gustave

18

간단한 복사 작업의 경우 copy-rename-maven-plugin을 추천 할 수 있습니다 . 사용이 간단하고 간단합니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

둘 이상의 파일을 복사하려면 <sourceFile>...</destinationFile>부품을

<fileSets>
  <fileSet>
    <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
    <destinationFile>target/someDir/environment.properties</destinationFile>
  </fileSet>
  <fileSet>
    <sourceFile>src/someDirectory/test.logback.xml</sourceFile>
    <destinationFile>target/someDir/logback.xml</destinationFile>
  </fileSet>                
</fileSets>

또한 필요한 경우 여러 단계에서 여러 실행을 지정할 수 있습니다. 두 번째 목표는 "이름 바꾸기"입니다. 이는 나머지 구성이 동일하게 유지되는 동안 간단히 말해줍니다. 더 많은 사용 예는 Usage-Page를 참조하십시오 .

참고 :이 플러그인은 디렉토리가 아닌 파일 만 복사 할 수 있습니다. (이 제한 사항을 찾은 @ james.garriss에게 감사합니다.)


2
이 플러그인이 마음에 들지만 디렉토리를 복사 할 수 없다는 것이 놀랍습니다.
— james.garriss

3
@ james.garriss 나는이 한계를 알지 못했지만 불행히도 당신이 옳습니다. 나는 이것을 사람들이 스스로 찾아내는 시간을 절약하기 위해 이것을 내 대답으로 편집 할 것이다.
— morten.c

7

위의 개미 솔루션은 구성하기가 가장 쉽지만 Atlassian의 maven-upload-plugin을 사용하여 운이 좋았습니다. 좋은 문서를 찾을 수 없었습니다. 사용 방법은 다음과 같습니다.

<build>
  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
       <resourceSrc>
             ${project.build.directory}/${project.build.finalName}.${project.packaging}
       </resourceSrc>
       <resourceDest>${jboss.deployDir}</resourceDest>
       <serverId>${jboss.host}</serverId>
       <url>${jboss.deployUrl}</url>
     </configuration>
  </plugin>
</build>

위에서 참조한 "$ {jboss.host}"와 같은 변수는 내 ~ / .m2 / settings.xml에 정의되어 있으며 maven 프로파일을 사용하여 활성화됩니다. 이 솔루션은 JBoss에 국한되지 않고 변수 이름입니다. 개발, 테스트 및 라이브에 대한 프로필이 있습니다. 테스트 환경에서 귀를 jboss 인스턴스에 업로드하려면 다음을 실행하십시오.

mvn upload:upload -P test

settings.xml의 스 니펫은 다음과 같습니다.

<server>
  <id>localhost</id>
  <username>username</username>
  <password>{Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1</password>
</server>
...
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <jboss.host>localhost</jboss.host> 
      <jboss.deployDir>/opt/jboss/server/default/deploy/</jboss.deployDir>
      <jboss.deployUrl>scp://root@localhost</jboss.deployUrl>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
       <jboss.host>testserver</jboss.host>
       ...

이 플러그인이있는 Atlassian maven 저장소는 https://maven.atlassian.com/public/

플러그인이 제공하는 모든 기능을 보려면 소스를 다운로드하고 내부 설명서를 참조하십시오.

`


5

글쎄, maven은 훌륭한 세분화 작업을 잘하지 않아야하며, bash 나 개미와 같은 스크립팅 언어가 아니며 오히려 선언적입니다-나는 전쟁이나 귀가 필요합니다. 그러나 전쟁이나 귀가 어떻게 보이는지 사용자 정의 해야하는 경우 문제가 있습니다. 그것은 개미처럼 절차 적이 지 않고 선언적입니다. 이것은 처음에는 몇 가지 장점이 있으며 끝에 많은 단점이있을 수 있습니다.

초기 개념은 훌륭한 플러그인을 가진 것으로 생각합니다. "그냥 작동"하지만 비표준 작업을 수행하면 현실이 다릅니다.

그러나 pom에 많은 노력을 기울이고 사용자 정의 플러그인을 거의 사용하지 않으면 개미와 같이 훨씬 더 나은 빌드 환경을 얻을 수 있습니다 (물론 프로젝트에 따라 다르지만 더 큰 프로젝트에서는 점점 더 사실입니다).



4

임의의 파일을 복사하는 일반적인 방법은 Maven Wagon 전송 추상화 입니다. 프로토콜 등을 통하여 다양한 목적지를 처리 할 수있는 file, HTTP, FTP, SCP또는 WebDAV.

을 사용하여 파일을 복사하는 기능을 제공하는 몇 가지 플러그인이 있습니다 Wagon. 가장 주목할만한 것은 :

  • 즉시 사용 가능한 Maven Deploy 플러그인

    이 deploy-file목표는. 그것은 융통성이 없지만 일을 끝낼 수 있습니다.

    mvn deploy:deploy-file -Dfile=/path/to/your/file.ext -DgroupId=foo 
    -DartifactId=bar -Dversion=1.0 -Durl=<url> -DgeneratePom=false

    사용의 중요한 단점 Maven Deploy Plugin 은 Maven 리포지토리와 함께 작동하도록 지정되어 있다는 것입니다. 특정 구조와 메타 데이터를 가정합니다. 파일이 아래에 배치 foo/bar/1.0/file-1.0.ext되고 체크섬 파일이 생성 된 것을 볼 수 있습니다 . 이 문제를 해결할 방법이 없습니다.

  • 왜건 메이븐 플러그인

    목표를 사용하십시오upload-single :

    mvn org.codehaus.mojo:wagon-maven-plugin:upload-single
    -Dwagon.fromFile=/path/to/your/file.ext -Dwagon.url=<url>

    사용 Wagon Maven Plugin복사 는 간단하며 가장 다재다능한 것 같습니다.


위의 예에서 <url>지원되는 프로토콜이 될 수 있습니다. 기존 목록보기 왜건 제공자 . 예를 들어

  • 파일을 로컬로 복사 : file:///copy/to
  • 실행중인 원격 호스트로 파일 복사 SSH:scp://host:22/copy/to


위의 예제는 명령 행에서 플러그인 매개 변수를 전달합니다. 또는 플러그인을 직접 구성 할 수 있습니다POM . 그러면 호출은 단순히mvn deploy:deploy-file@configured-execution-id . 또는 특정 빌드 단계에 바인딩 될 수 있습니다.


SCP작동 하는 프로토콜의 경우 다음에서 확장자를 정의해야합니다 POM.

<build>
  [...]
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.12</version>
    </extension>
  </extensions>


복사하려는 대상에 인증이 필요한 경우 Server설정을 통해 자격 증명을 제공 할 수 있습니다 . repositoryId/ serverId플러그인에 전달 된 설정에 정의 된 서버와 일치해야합니다.


3

$ {project.server.config} 속성이 사용자 정의 된 것으로 표준 디렉토리 레이아웃 외부에 있다고 가정 할 수 있습니다.

그렇다면 복사 작업을 사용합니다.


파일을 표준 디렉토리 레이아웃에 넣는 데주의를 기울 이겠습니다. Maven은 zip / jar가 아닌 대상에 그대로 복사 할 수 있습니까?
— Joshua Fox

2

또 다른 방법은 어셈블리 플러그인을 사용하여 이러한 것들을 이슈로 묶는 것입니다. 그런 다음 종속성 플러그인을 사용하여 원하는 곳에서 이러한 파일의 압축을 풉니 다. 종속성 플러그인에는 아티팩트를 복사하기위한 복사 목표도 있습니다.


1

이 답변에 대해 여러 가지 다른 출처를 모을 수있었습니다.

...
<repository>
    <id>atlassian</id>
    <name>Atlassian Repo</name>
    <url>https://maven.atlassian.com/content/repositories/atlassian-public</url>
</repository>
...
<dependency>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
</dependency>
...
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <serverId>jira-repo</serverId>
        <resourceSrc>
            ${project.build.directory}/${project.build.finalName}.${project.packaging}
        </resourceSrc>
        <resourceDest>opt/jira/webapps</resourceDest> <!-- note: no leading slash -->
        <url>scp://root@jira</url>
    </configuration>
</plugin>
...

보낸 사람 ~/.m2/settings.xml:

...
<servers>
  <server>
    <id>jira-repo</id>
    <username>myusername</username>
    <password>mypassword</password>
  </server>
</servers>
...

그런 다음 명령을 실행하십시오 (-X는 디버그 용임).

mvn -X upload:upload


-1

위의 좋은 답변을 요약하면 다음과 같습니다. Maven 은 모듈을 빌드하고 결과를 Maven 저장소에 복사하도록 설계되었습니다. 모듈을 배치 / 설치자 입력 디렉토리로 복사 하는 것은 Ant / Maven copy 명령 과 같이 Maven의 핵심 기능과 관련하여 수행해야합니다 .


Ant는 Maven의 핵심 기능에 속하며 Wagon도 마찬가지입니다 (하지만 플러그인은 공식 Maven 핵심 플러그인은 아니지만).
— GeroldBroser가 Monica를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.