Respostas:
Supondo que você esteja usando Java, você pode
Crie um .properties
arquivo (geralmente) no seu src/main/resources
diretório (mas na etapa 4 você pode pedir para procurar em outro lugar).
Defina o valor de alguma propriedade em seu .properties
arquivo usando a propriedade Maven padrão para a versão do projeto: foo.bar=${project.version}
No seu código Java, carregue o valor do arquivo de propriedades como um recurso do caminho de classe (google para obter exemplos abundantes de como fazer isso, mas aqui está um exemplo para iniciantes ).
No Maven, ative a filtragem de recursos - isso fará com que o Maven copie esse arquivo em suas classes de saída e traduza o recurso durante essa cópia, interpretando a propriedade. Você pode encontrar algumas informações aqui, mas na maioria das vezes você faz isso em seu pom:
<build> <recursos> <resource> <directory> src / main / resources </directory> <filtering> true </filtering> </resource> </resources> </build>
Você também pode obter outras propriedades padrão project.name
, como , project.description
ou mesmo propriedades arbitrárias que você coloca no seu pom <properties>
, etc. Quando você especifica um perfil em tempo de execução com -PmyProfile
, isso pode ativar propriedades que podem aparecer na sua construção.
src/main/resources
, pois isso pode processar todos os arquivos localizados neste diretório, incluindo arquivos de binários. Para evitar comportamentos imprevisíveis, é melhor fazer a filtragem em um src/main/resources-filtered
diretório, conforme sugerido aqui . De qualquer forma, obrigado por este belo truque!
A resposta aceita pode ser a melhor e mais estável maneira de obter um número de versão em um aplicativo estaticamente , mas na verdade não responde à pergunta original: Como recuperar o número da versão do artefato do pom.xml? Portanto, quero oferecer uma alternativa mostrando como fazê-lo dinamicamente durante o tempo de execução:
Você pode usar o próprio Maven. Para ser mais exato, você pode usar uma biblioteca Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
E então faça algo parecido com isto em Java:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
O log do console é o seguinte:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Atualização 2017-10-31: Para responder à pergunta de acompanhamento de Simon Sobisch, modifiquei o exemplo da seguinte maneira:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
package
d jar normal (as classes de dependência não estão integradas) e não funciona quando compactado com o maven-assembly-plugin jar-with-dependencies
que recebo a java.io.FileNotFoundException: pom.xml
(está no jarro final como META-INF/maven/my.package/myapp/pom.xml
) - alguma dica de como resolver isso?
Os artefatos empacotados contêm um META-INF/maven/${groupId}/${artifactId}/pom.properties
arquivo cujo conteúdo se parece com:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Muitos aplicativos usam esse arquivo para ler a versão do aplicativo / jar em tempo de execução; não é necessária nenhuma configuração.
O único problema com a abordagem acima é que esse arquivo é (atualmente) gerado durante a package
fase e, portanto, não estará presente durante os testes, etc. (existe um problema no Jira para alterar isso, consulte MJAR-76 ). Se esse é um problema para você, a abordagem descrita por Alex é o caminho a seguir.
Há também o método descrito em Maneira fácil de exibir o número da versão do seu aplicativo usando o Maven :
Adicione isso ao pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>test.App</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Então use isto:
App.class.getPackage().getImplementationVersion()
Eu achei esse método mais simples.
getImplementationVersion()
era null
. (versão maven 3.0.4)
.war
artefatos, lembre-se de usar em maven-war-plugin
vez demaven-jar-plugin
getImplementationVersion()
retorna nulo).
Se você usar pacotes mvn como jar ou war, use:
getClass().getPackage().getImplementationVersion()
Ele lê uma propriedade "Implementation-Version" do META-INF / MANIFEST.MF gerado (definido como a versão do pom.xml) no arquivo morto.
Para complementar o que a @kieste postou, acho que é a melhor maneira de o Maven criar informações disponíveis no seu código se você estiver usando o Spring-boot: a documentação em http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info é muito útil.
Você só precisa ativar os atuadores e adicionar as propriedades necessárias em seu application.properties
ouapplication.yml
Automatic property expansion using Maven
You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @..@ placeholders, e.g.
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
Use esta biblioteca para facilitar uma solução simples. Adicione ao manifesto o que você precisar e, em seguida, consulte por string.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Às vezes, a linha de comando do Maven é suficiente ao criar scripts para algo relacionado à versão do projeto, por exemplo, para recuperação de artefato via URL de um repositório:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Exemplo de uso:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Obter versão usando this.getClass().getPackage().getImplementationVersion()
PS Não se esqueça de adicionar:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Com referência à resposta de ketankk :
Infelizmente, adicionar isso interferiu na maneira como meu aplicativo lida com recursos:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Mas usar esta tag <manifest> do maven-assemble-plugin fez o truque:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Então eu pude obter a versão usando
String version = getClass().getPackage().getImplementationVersion();