Tenho um projeto de vários módulos, como este:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Preciso definir um conjunto de propriedades (que dependem do ambiente no qual desejo lançar meu projeto) no Maven2. Não vou usar <properties>
porque tem muitas propriedades ... Assim, utilizo o plugin Propriedades do Maven2 .
Os arquivos de propriedades estão localizados no main-project/
diretório. Como posso definir o diretório correto no pom.xml principal, a fim de especificar para qualquer filho onde encontrar o arquivo de propriedades?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Se eu definir apenas <file>env_${env}.properties</file>
, quando o Maven2 compilar o primeiro módulo, ele não encontrará o main-project/env_dev.properties
arquivo. Se eu definir <file>../env_${env}.properties</file>
, um erro será gerado no nível dos pais ou em qualquer nível de submódulo ...
fonte
${maven.multiModuleProjectDirectory}
Respostas:
Tente definir uma propriedade em cada pom para encontrar o diretório principal do projeto.
No pai:
Nas crianças:
Nos netos:
fonte
${parent.basedir}
não analisa mais nada em 3.0.4 ...${project.basedir}/..
mas isso realmente só funciona em projetos de vários módulos que estão em uma hierarquia de diretório estrita.file.separator
variável assim<main.basedir>${project.basedir}${file.separator}..</main.basedir>
Pelo menos na versão atual do maven (3.6.0), você pode fazer uso de
${maven.multiModuleProjectDirectory}
fonte
Use o plugin do diretório-maven com o objetivo do diretório .
Ao contrário de outras sugestões:
O plugin permite que você defina uma propriedade de sua escolha para o caminho absoluto de qualquer um dos módulos do projeto. No meu caso, configurei-o para o módulo raiz ... No meu projeto root pom:
A partir daí, $ {myproject.basedir} em qualquer submódulo pom sempre tem o caminho do módulo raiz do projeto. E, claro, você pode definir a propriedade para qualquer módulo, não apenas a raiz ...
fonte
Eu encontrei uma solução para resolver meu problema: eu procuro os arquivos de propriedades usando o plugin Groovy Maven.
Como meu arquivo de propriedades está necessariamente no diretório atual, em ../ ou em .. / .., escrevi um pequeno código do Groovy que verifica essas três pastas.
Aqui está o extrato do meu pom.xml:
Isso está funcionando, mas eu realmente não gosto disso.
Portanto, se você tiver uma solução melhor, não hesite em postar!
fonte
Portanto, o problema, a meu ver, é que você não pode obter o caminho absoluto para um diretório pai no maven.
<rant> Já ouvi falar disso como um antipadrão , mas para cada antipadrão existe um caso de uso real e legítimo para ele, e estou farto de saber que o maven me diz que só posso seguir seus padrões. </ discurso retórico>
Então, a solução que descobri foi usar antrun. Experimente isso no pom.xml filho:
Se você executar,
mvn verify
deverá ver algo assim:Você pode então usar
${main.basedir}
qualquer um dos outros plug-ins, etc. Levei um tempo para descobrir isso, então espero que ajude alguém.fonte
Outra alternativa:
no pom pai, use:
Nos poms filhos, você pode fazer referência a essa variável.
Advertência principal: força você a sempre executar o comando a partir do diretório principal do pom. Então, se você quiser executar comandos (teste, por exemplo) apenas para algum módulo específico, use esta sintaxe:
teste de mvn --projects
A configuração do surefire para parametizar uma variável "path_to_test_data" pode então ser:
fonte
O seguinte pequeno perfil funcionou para mim. Eu precisava dessa configuração para CheckStyle, que coloquei no
config
diretório na raiz do projeto, para que possa executá-lo a partir do módulo principal e dos submódulos.Não funcionará com módulos aninhados, mas tenho certeza que pode ser modificado para isso usando vários perfis com diferentes
exists
. (Não tenho ideia de por que deveria haver "../ .." na tag de verificação e apenas ".." na própria propriedade substituída, mas funciona apenas dessa maneira.)fonte
No meu caso, funciona assim:
fonte
Encontrei uma solução para resolver este problema: use $ {parent.relativePath}
fonte
Você está no projeto C, o projeto C é o submódulo de B e B é o submódulo de A. Você tenta alcançar o
src/test/config/etc
diretório do módulo D a partir do projeto C. D também é o submódulo de A. A seguinte expressão torna isso possível obter o caminho URI:fonte
fonte
Em uma resposta a outra pergunta , mostrei como o plug-in de propriedades do maven poderia ser estendido para usar descritores de propriedade externos definidos nas dependências do Maven.
Você poderia estender essa ideia para ter vários jars descritores, cada um com o nome do ambiente como parte do artifactId, contendo $ {env} .properties. Em seguida, você pode usar a propriedade para selecionar o jar e o arquivo de propriedades apropriados, por exemplo:
fonte
Acabei de melhorar o excelente script acima para escrever a propriedade no arquivo de propriedades do pai raiz:
fonte
Eu acho que se você usar o padrão de extensão usado no exemplo para o plugin findbugs e multimodule, você pode ser capaz de definir propriedades globais relacionadas a caminhos absolutos. Usa um top
exemplo para multi módulo
O pom de nível superior tem um projeto build-config não relacionado e um app-parent para os módulos do projeto multimodule. O app-parent usa a extensão para se vincular ao projeto build-config e obter recursos dele. Isso é usado para transportar arquivos de configuração comuns para os módulos. Pode ser um canal para propriedades também. Você pode escrever o diretório principal em um arquivo de propriedade consumido pelo build-config. (parece muito complexo)
O problema é que um novo nível superior deve ser adicionado ao projeto multimódulo para que isso funcione. Eu tentei evitar um projeto build-config verdadeiramente não relacionado, mas era confuso e parecia frágil.
fonte
Isso estende a resposta do romaintaz, que é incrível porque resolve o problema e também aponta claramente a funcionalidade ausente do maven. Peguei uma versão posterior do plugin e adicionei o caso em que o projeto poderia ter mais de 3 níveis de profundidade.
Decidi não usar uma propriedade para definir o nome do arquivo. Observe que se o build.properties não for encontrado, ele girará para sempre. Eu adicionei uma detecção de dir .git, mas não queria complicar demais a resposta, então ela não é mostrada aqui.
fonte
Eu precisava resolver um problema semelhante para o repositório local colocado no projeto principal do projeto multimódulo. Essencialmente, o caminho real era
${basedir}
/ lib. Finalmente resolvi isso em meuparent.pom
:Isso
basedir
sempre mostra para o módulo local atual, que não há como obter o caminho para o projeto "mestre" (vergonha de Maven). Alguns dos meus submódulos são um dir mais profundo, alguns são dois dirs mais profundos, mas todos eles são submódulos diretos do pai que define a URL do repo.Portanto, isso não resolve o problema em geral. Você sempre pode combiná-la com a resposta aceita de Clay e definir alguma outra propriedade - funciona bem e precisa ser redefinida apenas para casos em que o valor de
parent.pom
não é bom o suficiente. Ou você pode apenas reconfigurar o plugin - o que você faz apenas em artefatos POM (pais de outros submódulos). O valor extraído na propriedade é provavelmente melhor se você precisar dele em mais lugares, especialmente quando nada na configuração do plugin muda.Usar
basedir
no valor era a parte essencial aqui, porque a URLfile://${project.parent.relativePath}/lib
não queria fazer o truque (removi uma barra para torná-la relativa). Usar uma propriedade que me dá um bom caminho absoluto e, em seguida, ir em relação a ela era necessário.Quando o caminho não é URL / URI, provavelmente não é um problema descartá-lo
basedir
.fonte
Eu acessei o diretório acima usando $ {basedir} .. \ src \
fonte
sub-module1
, ele apontará para o diretório demodule2
, não paramain-project
.Você tentou
../../env_${env}.properties
?Normalmente fazemos o seguinte quando o módulo 2 está no mesmo nível que os submódulos
Eu acho que ../ .. deixaria você pular dois níveis. Caso contrário, você pode entrar em contato com os autores do plug-in e ver se esse é um problema conhecido.
fonte