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

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은 번거롭지 않고 이러한 표준 작업을 수행하는 데 탁월합니다.

어떤 충고?



답변

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

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


답변

<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 의존성 플러그인은 개미 작업을 좋아하는 많은 시간을 절약했습니다.

<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이며, 압축 풀기와 같은 더 유용한 목표를 가지고있다.


답변

간단한 복사 작업의 경우 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에게 감사합니다.)


답변

위의 개미 솔루션은 구성하기가 가장 쉽지만 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/

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

`


답변

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

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

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