문제

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


일부 옵션은 다음과 같습니다.

  • 간단한 사용 복사 Maven의 작업

<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>

  • Ant 플러그인을 사용하여 실행 복사 앤트에서.

  • 유형의 아티팩트 구성 지퍼, 일반적으로 유형의 POM의 "기본" 아티팩트와 함께 항아리, 그 다음에 짐 등에서 꺼내다 해당 아티팩트를 저장소에서 대상 디렉터리로 복사합니다.

  • 메이븐 리소스 플러그인은 아래 언급한 대로입니다.

  • Maven 어셈블리 플러그인 -- 하지만 간단하고 "전통적인" 방식으로 작업을 수행하려면 수동 정의가 많이 필요한 것 같습니다.

  • 이 페이지 심지어 복사를 위한 플러그인을 만드는 방법도 보여줍니다!

  • 메이븐 업로드 플러그인은 아래 언급한 대로입니다.

  • 메이븐 의존성 플러그인 ~와 함께 복사, 아래에 언급된 바와 같이.


이 모든 것은 불필요하게 임시적으로 보입니다.Maven은 소란과 번거로움 없이 이러한 표준 작업을 수행하는 데 탁월해야 합니다.

어떤 충고?

도움이 되었습니까?

해결책

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

<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을 빌드 시스템으로 사용하여 배포 가능한 아티팩트를 생성 한 다음 별도의 모듈 또는 다른 곳에서 이러한 사용자 정의를 수행하십시오. 더 많은 빌드 환경을 공유 한 경우 더 나은 방법이있을 수 있습니다. 여러 서버를 제공하는 플러그인이 있습니다. 서버의 루트에 포장되지 않은 어셈블리를 첨부 할 수 있습니까? 어떤 서버를 사용하고 있습니까?

다시, 나는 더 나은 방법이 있다고 확신합니다.

다른 팁

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

파일 사용을 복사하려면 :

        <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 Dependency 플러그인은 개미 작업으로 많은 시간을 절약했습니다.

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

그만큼 종속성 : 복사 문서화이며 포장 풀기와 같은 유용한 목표가 있습니다.

간단한 카피 작업을 위해 추천 할 수 있습니다 카피-미나 메이븐-플러그 인. 간단하고 사용하기 간단합니다.

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

또한 필요한 경우 여러 단계로 여러 실행을 지정할 수 있습니다. 두 번째 목표는 "이름 변경"입니다.이 구성은 단순히 나머지 구성이 동일하게 유지되는 동안 단순히 말하는 것을 수행합니다. 더 많은 사용 예제는 다음을 참조하십시오 사용 페이지.

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

위의 개미 솔루션은 구성하기가 가장 쉽지만 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}"와 같은 변수는 my ~/.m2/settings.xml에 정의되며 Maven 프로파일을 사용하여 활성화됩니다. 이 솔루션은 JBoss로 제한되지 않습니다. 이것이 제가 변수라고 명명 한 것입니다. Dev, Test 및 Live에 대한 프로필이 있습니다. 테스트 환경에서 귀를 JBoss 인스턴스에 업로드하려면 다음을 수행합니다.

mvn upload:upload -P test

다음은 settings.xml의 snipet입니다.

<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 Repo는 다음과 같습니다. https://maven.atlassian.com/public/

플러그인이 제공하는 모든 기능을 보려면 소스를 다운로드하고 내부 문서를 살펴 보는 것이 좋습니다.

`

글쎄, Maven은 훌륭한 세분화 작업을 수행하는 데 좋지 않아야합니다. 그것은 Bash 또는 Ant와 같은 스크립팅 언어가 아니며, 다소 선언적이라고 말합니다. 전쟁이나 귀가 필요합니다. 그러나 전쟁이나 귀가 내부의 모습을 맞춤화 해야하는 경우 문제가 있습니다. 개미와 같은 절차 적이 아니라 선언적입니다. 이것은 처음에 일부 전문가가 있으며, 마지막에 많은 단점을 가질 수 있습니다.

초기 개념은 훌륭한 플러그인을 갖는 것이 었습니다. "그냥 작동"하지만 비표준이 아닌 경우 현실은 다릅니다.

그러나 POMS와 맞춤형 플러그인이 거의 없으면 ANT와 같이 훨씬 더 나은 빌드 환경을 얻을 수 있습니다 (물론 프로젝트에 따라 다르지만 더 큰 프로젝트에는 점점 더 사실이됩니다).

나는 아주 좋은 경험을 가지고있었습니다 카피 메이븐-플루인. Maven-Resources-Plugin과 비교하여 훨씬 더 편리하고 간결한 구문이 있습니다.

임의의 파일을 복사하는 일반적인 방법은 메이븐 왜건 전송 추상화.다음과 같은 프로토콜을 통해 다양한 대상을 처리할 수 있습니다. file, HTTP, FTP, SCP 또는 WebDAV.

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

  • 상자 밖으로 Maven 배포 플러그인

    거기에는 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 플러그인에 전달된 내용은 설정에 정의된 서버와 일치해야 합니다.

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

그렇다면 복사 작업을 사용하겠습니다.

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

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

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

위의 훌륭한 답변 중 일부를 요약합니다. Maven 모듈을 빌드하고 결과를 Maven 저장소에 복사하도록 설계되었습니다. 배포/설치자 입력 디렉토리에 모듈을 복사하는 것은 Maven의 핵심 기능 (Ant/Maven)과의 컨텍스트 외부에서 수행해야합니다. 복사 명령.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top