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.