Percebi que no JAR de um artefato Maven, o atributo project.version está incluído em dois arquivos:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
Existe uma maneira recomendada de ler esta versão em tempo de execução?
Respostas:
Você não precisa acessar arquivos específicos do Maven para obter as informações da versão de qualquer biblioteca / classe.
Você pode simplesmente usar
getClass().getPackage().getImplementationVersion()
para obter as informações da versão armazenadas em um arquivo .jarMANIFEST.MF
.Felizmente, o Maven é inteligente o suficienteInfelizmente, por padrão, o Maven não grava as informações corretas no manifesto!Em vez disso, é necessário modificar o
<archive>
elemento de configuração demaven-jar-plugin
to setaddDefaultImplementationEntries
andaddDefaultSpecificationEntries
totrue
, assim:Idealmente, essa configuração deve ser colocada na empresa
pom
ou em outro pom base.A documentação detalhada do
<archive>
elemento pode ser encontrada na documentação do Maven Archive .fonte
Para acompanhar a resposta acima, para um
.war
artefato, descobri que tinha de aplicar a configuração equivalentemaven-war-plugin
, em vez demaven-jar-plugin
:Isso, somado as informações de versão para
MANIFEST.MF
nos do projeto.jar
(incluído noWEB-INF/lib
do.war
)fonte
null
embora o MANIFEST.MF nos arquivos de guerra contenha as informações corretas.<archiveClasses>true</archiveClasses>
- e funciona de maneira confiável desde então.Aqui está um método para obter a versão do pom.properties, voltando a obtê-la do manifesto
fonte
Passei algum tempo nas duas principais abordagens aqui e elas não deram certo para mim. Estou usando o Netbeans para as compilações, pode haver mais acontecendo lá. Eu tive alguns erros e avisos do Maven 3 com algumas construções, mas acho que foram fáceis de corrigir. Nada demais.
Encontrei uma resposta que parece sustentável e simples de implementar neste artigo no DZone:
Eu já tenho uma subpasta resources / config e nomeei meu arquivo: app.properties, para refletir melhor o tipo de coisa que podemos manter lá (como uma URL de suporte etc.).
A única ressalva é que o Netbeans avisa que o IDE precisa ser filtrado. Não sabe onde / como. Não tem efeito neste momento. Talvez haja uma solução para isso, se eu precisar atravessar a ponte. Boa sorte.
fonte
Estou usando
maven-assembly-plugin
para minha embalagem maven. O uso do Apache Maven Archiver na resposta de Joachim Sauer também pode funcionar:Como o archiever é um dos componentes compartilhados do maven , ele pode ser usado por vários plugins de construção do maven, que também podem entrar em conflito se forem introduzidos dois ou mais plugins, incluindo a
archive
configuração interna.fonte
Para que isso seja executado no Eclipse, bem como em uma construção do Maven, você deve adicionar as entradas
addDefaultImplementationEntries
eaddDefaultSpecificationEntries
pom conforme descrito em outras respostas e, em seguida, usar o seguinte código:Se sua construção Java coloca as classes de destino em algum lugar que não seja "target / classes", talvez seja necessário ajustar o valor de segmentosToRemove.
fonte
System.getProperty("user.dir")/pom.xml
. Tenho certeza de que o fará para outras coisas, exceto talvez não para WTP..getResource()
ou.getResourceAsStream()
.No meu aplicativo de inicialização da primavera, a solução da resposta aceita funcionou até que eu atualizei recentemente meu jdk para a versão 12. Tentei todas as outras respostas também e não consegui fazê-la funcionar.
Nesse ponto, adicionei a linha abaixo à primeira classe do meu aplicativo de inicialização por primavera, logo após a anotação
@SpringBootApplication
Posteriormente, uso o abaixo para obter o valor do arquivo de propriedades em qualquer classe que desejar usar seu valor e
appVersion
obter a versão do projeto para mim:Espero que ajude alguém.
fonte
Uma solução simples que é compatível com Maven e funciona para qualquer classe (portanto também de terceiros):
fonte
Variante Java 8 para EJB no arquivo war com projeto maven. Testado no EAP 7.0.
fonte