Melhores práticas para copiar arquivos com o Maven

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

Algumas das opções:

  • Simples use uma tarefa de cópia no Maven

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

  • Construa um artefato do tipo zip , juntamente com o artefato “principal” do POM, que geralmente é do tipo jar , e descompacte esse artefato do repository no diretório de destino.

  • plugin maven-resources , como mencionado abaixo.

  • Maven Assembly plugin – mas isso parece exigir um monte de definições manuais, quando eu quero fazer as coisas de forma simples e “convencional”.

  • Esta página ainda mostra como construir um plugin para copiar!

  • plugin maven-upload , como mencionado abaixo.

  • maven-dependency-plugin com cópia , como mencionado abaixo.

Tudo isso parece desnecessariamente ad hoc: supõe-se que o Maven se sobressaia em fazer essas tarefas padrão sem problemas e incômodos.

Algum conselho?

   

Não se coíbe de usar o plugin Antrun. Só porque algumas pessoas tendem a pensar que Ant e Maven estão em oposição, elas não são. Use a tarefa de cópia se precisar executar alguma personalização única inevitável:

  [...]   [...]  maven-antrun-plugin   deploy       run       [...]  

Ao responder a essa pergunta, estou me concentrando nos detalhes do que você pediu. Como faço para copiar um arquivo? A questão e o nome da variável levam-me a questões maiores como: “Existe uma maneira melhor de lidar com o provisionamento de servidores?” Use o Maven como um sistema de construção para gerar um artefato implementável e, em seguida, execute essas personalizações em módulos separados ou em outro local totalmente. Se você compartilhou um pouco mais do seu ambiente de criação, pode haver uma maneira melhor – existem plug-ins para provisionar vários servidores. Você poderia append uma assembly que é descompactada na raiz do servidor? Qual servidor você está usando?

Mais uma vez, tenho certeza de que há um jeito melhor.

   ...  org.apache.maven.plugins maven-resources-plugin 2.3     src/main/java   **/*.properties    ...  

Para copiar um arquivo use:

   maven-resources-plugin 2.7   copy-resource-one install  copy-resources   ${basedir}/destination-folder   /source-folder  file.jar        

Para copiar a pasta com subpastas, use a próxima configuração:

   ${basedir}/target-folder   /source-folder true    

O plugin maven dependency me poupou muito tempo acariciando com tarefas ant:

  org.apache.maven.plugins maven-dependency-plugin   install-jar install  copy     ... ... ...   ... true     

A dependência: copy é documentend e tem objectives mais úteis, como descompactar.

Para uma simples tarefa de cópia, posso recomendar copy-rename-maven-plugin . É simples e simples de usar:

  ...    com.coderplus.maven.plugins copy-rename-maven-plugin 1.0   copy-file generate-sources  copy   src/someDirectory/test.environment.properties target/someDir/environment.properties        

Se você quiser copiar mais de um arquivo, substitua a parte ...

   src/someDirectory/test.environment.properties target/someDir/environment.properties   src/someDirectory/test.logback.xml target/someDir/logback.xml   

Além disso, você pode especificar várias execuções em várias fases, se necessário, o segundo objective é “renomear”, que simplesmente faz o que diz enquanto o resto da configuração permanece o mesmo. Para mais exemplos de uso, consulte a Página de Uso .

Nota : Este plugin só pode copiar arquivos, não diretórios. (Obrigado a @ james.garriss por encontrar essa limitação.)

A solução ant formiga acima é mais fácil de configurar, mas tive sorte usando o plugin maven-upload da Atlassian. Não consegui encontrar uma boa documentação, aqui está como eu uso:

   com.atlassian.maven.plugins maven-upload-plugin 1.1   ${project.build.directory}/${project.build.finalName}.${project.packaging}  ${jboss.deployDir} ${jboss.host} ${jboss.deployUrl}    

As variables ​​como “$ {jboss.host}” referenciadas acima são definidas no meu ~ / .m2 / settings.xml e são ativadas usando perfis maven. Esta solução não é restrita ao JBoss, isso é apenas o que eu nomeei minhas variables. Eu tenho um perfil para dev, teste e ao vivo. Então, para carregar meu ouvido para uma instância do jboss no ambiente de teste, eu executaria:

 mvn upload:upload -P test 

Aqui está um snipet de settings.xml:

  localhost username {Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1  ...   dev  localhost /opt/jboss/server/default/deploy/ scp://root@localhost    test  testserver ... 

Notas: O repository maven da Atlassian que tem este plugin está aqui: https://maven.atlassian.com/public/

Eu recomendo baixar as fonts e olhar a documentação dentro para ver todos os resources que o plugin fornece.

`

Bem, não é suposto que o maven seja bom em executar tarefas granulares refinadas, não é uma linguagem de script como bash ou ant, é bastante declarativo – você diz – eu preciso de uma guerra, ou de um ouvido, e você entende. No entanto, se você precisar personalizar a aparência da guerra ou do ouvido, terá um problema. Não é apenas processual como formiga, mas declarativa. Isso tem alguns profissionais no começo, e pode ter muitos contras no final.

Eu acho que o conceito inicial era ter plugins finos, que “apenas funcionam”, mas a realidade é diferente se você faz coisas não-padrão.

Se você, no entanto, colocar bastante esforço em seus poms e em alguns plugins personalizados, você terá um ambiente de construção muito melhor do que com formigas por exemplo (depende do seu projeto, é claro, mas se torna cada vez mais verdadeiro para projetos maiores).

Eu tive uma experiência muito boa com o copy-maven-plugin . Ele tem uma syntax muito mais conveniente e concisa em comparação com o plugin maven-resources.

Eu só posso supor que sua propriedade $ {project.server.config} é algo personalizado e está fora do layout do diretório padrão.

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

Uma maneira genérica de copiar arquivos arbitrários é utilizar a abstração de transporte Maven Wagon . Ele pode manipular vários destinos por meio de protocolos como file , HTTP , FTP , SCP ou WebDAV .

Existem alguns plugins que fornecem facilidades para copiar arquivos através do uso de Wagon . Os mais notáveis ​​são:

  • Plug-in Implantado do Maven Implantado

    Existe o objective do deploy-file . É bastante inflexível, mas pode fazer o trabalho.

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

    A desvantagem significativa de usar o Maven Deploy Plugin é que ele é designado para funcionar com repositorys Maven. Assume estrutura e metadados particulares. Você pode ver que o arquivo é colocado sob foo/bar/1.0/file-1.0.ext e arquivos checksum são criados. Não há maneira de contornar isso.

  • Wagon Maven Plugin

    Use o objective upload-single :

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

    O uso do Wagon Maven Plugin para cópia é simples e parece ser o mais versátil.

Nos exemplos acima, pode ser de qualquer protocolo suportado. Veja a lista de provedores de vagão existentes. Por exemplo

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

Os exemplos acima passam os parâmetros do plugin na linha de comando. Alternativamente, os plugins podem ser configurados diretamente no POM . Em seguida, a chamada será simplesmente como mvn deploy:deploy-file@configured-execution-id . Ou pode ser ligado a uma fase específica de construção.

Por favor, note que para protocolos como o SCP funcionar, você precisará definir uma extensão em seu POM :

  [...]   org.apache.maven.wagon wagon-ssh 2.12   

Se o destino para o qual você está copiando requer autenticação, as credenciais podem ser fornecidas por meio das configurações do Server . repositoryId / serverId passado para os plugins deve corresponder ao servidor definido nas configurações.

Outra maneira é agrupar essas coisas em um artefato usando o plug-in de assembly. Então você pode usar o plugin de dependência para descompactar esses arquivos onde quiser. Há também objectives de cópia no plug-in de dependência para copiar artefatos.

Consegui reunir várias fonts diferentes para essa resposta:

 ...  atlassian Atlassian Repo https://maven.atlassian.com/content/repositories/atlassian-public  ...  com.atlassian.maven.plugins maven-upload-plugin 1.1  ...  com.atlassian.maven.plugins maven-upload-plugin 1.1  jira-repo  ${project.build.directory}/${project.build.finalName}.${project.packaging}  opt/jira/webapps  scp://root@jira   ... 

De ~/.m2/settings.xml :

 ...   jira-repo myusername mypassword   ... 

Em seguida, execute o comando: (o -X é para debugging)

mvn -X upload:upload

Para resumir algumas das respostas acima: O Maven foi projetado para criar módulos e copiar os resultados para um repository Maven. Qualquer cópia dos módulos em um diretório de implantação / instalação-instalação deve ser feita fora do contexto da funcionalidade principal do Maven, por exemplo, com o comando de cópia Ant / Maven.