Pergunta

Eu tenho arquivos de configuração e vários documentos que eu quero copiar a partir do ambiente dev para o diretório dev-servidor usando Maven2. Estranhamente, Maven não parece forte nessa tarefa.


Algumas das opções:

  • O uso simples um cópia tarefa Maven

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

  • Use o plugin Ant para executar cópia do Ant.

  • Construir um artefato do tipo zip , ao lado do artefato "principal" do POM que é geralmente do tipo jar , em seguida, descompactar aquele artefato do repositório no diretório de destino.

  • Maven de recursos plugin, como mencionado abaixo.

  • Assembleia Maven plugin - "convencionalmente", mas isso parece exigir um monte de definições manuais, quando eu quero fazer as coisas de forma simples e

  • até mesmo programas Esta página como construir um plugin para fazer a cópia!

  • maven-upload plugin, como mencionado abaixo.

  • maven-dependência-plugin com cópia , conforme mencionado abaixo.


Todos estes parecem desnecessariamente ad hoc: Maven é suposto excel em fazer essas tarefas padrão sem barulho e incomodar.

Qualquer conselho?

Foi útil?

Solução

Não se coíbe do plugin antrun. Só porque algumas pessoas tendem a pensar que Ant e Maven estão em oposição, eles não são. Use a tarefa de cópia se você precisa executar alguma one-off inevitável personalização:

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

Para responder a esta pergunta, eu estou focando os detalhes do que você pediu. Como faço para copiar um arquivo? A questão eo nome da variável me levar a uma série de perguntas maiores, como: "Existe uma maneira melhor de lidar com o servidor de provisionamento?" Use Maven como um sistema de compilação para gerar artefato implantável, em seguida, realizar essas personalizações tanto em módulos separados ou em outro lugar inteiramente. Se você compartilhou um pouco mais de seu ambiente de construção, pode haver uma maneira melhor - existem plugins para prestação de um número de servidores. você pode anexar uma montagem que é descompactado na raiz do servidor? O servidor que você está usando?

Novamente, eu tenho certeza que há uma maneira melhor.

Outras dicas

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

Para copiar um uso arquivo:

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

De modo a pasta de cópia com sub-pastas usar configuração seguinte:

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

O maven dependência plug-in me salvou um monte de tempo acariciando com tarefas Ant:

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

O href="http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html" rel="nofollow noreferrer"> dependência é documentend, e tem objetivos mais úteis como descompactar.

Para um simples copy-tarefas posso recomendar cópia-rename-maven-plugin . É simples e fácil de usar:

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

Se você gostaria de copiar mais de um arquivo, substituir a peça <sourceFile>...</destinationFile> com

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

Além disso, você pode especificar várias execuções em várias fases, se necessário, o segundo objetivo é "renomeação", que simplesmente faz o que diz, enquanto o resto das estadias de configuração da mesma. Para mais exemplos de uso referem-se ao Usage-página .

Nota : Este plugin só pode copiar arquivos, não diretórios. (Graças a @ james.garriss para encontrar esta limitação.)

A solução formiga acima é mais fácil de configurar, mas eu tive sorte com o maven--upload plugin do Atlassian. Eu era incapaz de encontrar uma boa documentação, aqui está como eu usá-lo:

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

As variáveis ??como "$ {jboss.host}" referenciado acima são definidos em meu ~ / .m2 / settings.xml e são ativados usando perfis Maven. Esta solução não é restrito a JBoss, este é apenas o que eu nomeei meu variáveis. Eu tenho um perfil para dev, teste e ao vivo. Então, para fazer upload de meus ouvidos a uma instância JBoss em ambiente de teste que eu iria executar:

mvn upload:upload -P test

Aqui está uma snipet de 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>
       ...

Notas: A repo maven Atlassian que tem este plugin está aqui: https://maven.atlassian.com/public/

eu recomendo o download das fontes e olhando para o interior documentação para ver todas as características do plugin fornece.

`

Bem, o perito não é suposto ser bom em fazer finas tarefas granulares, não é uma linguagem de script como bash ou formiga, é bastante declarativa - você diz - eu preciso de uma guerra, ou uma orelha, e você obtê-lo . No entanto, se você precisa para personalizar a forma como a guerra ou na orelha deve olhar como dentro, você tem um problema. Não é apenas processual como formiga, mas declarativa. Este tem alguns prós no início, e pode ter um monte de contras no final.

Eu acho que o conceito inicial era ter plugins finas, que "apenas trabalho", mas a realidade é diferente se você fazer coisas fora do padrão.

Se você no entanto colocar bastante esforço em seus poms e alguns plugins personalizados, você vai ter um melhor ambiente de construção tanto quanto com formiga por exemplo (depende do que você projeta é claro, mas torna-se mais e mais verdadeiro para projetos maiores) .

Eu tive uma experiência muito boa com cópia-maven-plugin . Ele tem uma sintaxe muito mais conveniente e conciso em comparação com maven-recursos-plugin.

A forma genérica para copiar arquivos arbitrários é utilizar Maven Wagon abstração transporte. Ele pode lidar com vários destinos através de protocolos como file, HTTP, FTP, SCP ou WebDAV.

Existem alguns plugins que oferecem funcionalidade de copiar arquivos através do uso de Wagon. Mais notáveis ??são:

  • Out-of-the-box Maven Deploy Plugin

    Não é o objetivo deploy-file . É bastante inflexível, mas pode começar o trabalho feito:

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

    desvantagem significativa ao uso de Maven Deploy Plugin é que ele é designado para trabalhar com repositórios Maven. Assume-se em particular a estrutura e os metadados. Você pode ver que o arquivo é colocado sob foo/bar/1.0/file-1.0.ext e arquivos de checksum são criados. Não há maneira de contornar isso.

  • Wagon Maven Plugin

    Use a upload-single objetivo :

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

    O uso de Wagon Maven Plugin para copiar é simples e parece ser o mais versátil.


Nos exemplos acima <url> pode ser de qualquer protocolo suportado. Veja a lista de Provedores vagão existentes . Por exemplo

  • copiar arquivo localmente: file:///copy/to
  • copiar arquivos para o host remoto executando SSH: scp://host:22/copy/to


Os exemplos acima passar parâmetros de encaixe na linha de comando. Alternativamente, encaixes podem ser configuradas directamente no POM. Em seguida, a invocação será simplesmente como mvn deploy:deploy-file@configured-execution-id. Ou pode ser obrigado a determinada fase de construção.


Por favor note que para protocolos como SCP ao trabalho você precisará definir uma extensão em sua POM:

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


Se o destino que você está copiando para exigir autenticação, credenciais podem ser fornecidas através de Server configurações . repositoryId / serverId passado para os plugins deve coincidir com o servidor definido nas configurações.

Eu só posso assumir que o seu $ {project.server.config} propriedade é algo definido personalizado e está fora da estrutura de diretório padrão.

Se sim, então eu usaria a tarefa de cópia.

Outra maneira é agrupar essas coisas em um artefato usando o plugin de montagem. Então você pode usar o plugin dependência para descompactar esses arquivos onde quiser. Há também copiar gols na dependência do plugin para copiar artefatos.

Eu era capaz de reunir um número de diferentes fontes para esta resposta:

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

De ~/.m2/settings.xml:

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

Em seguida, execute o comando: (a -X é para depuração)

mvn -X upload:upload

Para resumir algumas das respostas finas acima: Maven é projetado para módulos de construção e copiar os resultados para um repositório Maven. Qualquer cópia de módulos para um directório implantação /-entrada instalador deve ser feito fora do contexto da funcionalidade central do Maven, v.g. com o Ant / Maven cópia comando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top