[java] 코드의 maven pom.xml에서 버전 검색

프로그래밍 방식으로 코드에서 maven의 pom.xml에서 버전 번호를 검색하는 가장 간단한 방법은 무엇입니까?



답변

Java를 사용한다고 가정하면

  1. 디렉토리 .properties에 (가장 일반적으로) 파일을 작성하십시오 src/main/resources(그러나 4 단계에서 다른 곳을 보도록 지시 할 수 있습니다).

  2. .properties프로젝트 버전의 표준 Maven 속성을 사용 하여 파일 의 일부 속성 값을 설정하십시오 . foo.bar=${project.version}

  3. Java 코드에서 특성 파일의 값을 클래스 경로의 자원으로로드하십시오 (Google은이를 수행하는 방법에 대한 예는 많지만 여기에는 starters에 대한 예가 있습니다 ).

  4. Maven에서 리소스 필터링을 활성화하면 Maven이 해당 파일을 출력 클래스로 복사하고 해당 복사본 동안 리소스를 변환하여 속성을 해석합니다. 당신은 여기에 몇 가지 정보를 찾을 수 있지만 당신은 대부분 당신의 치어 에서이 작업을 수행합니다 :

    <빌드>
      <자원>
        <자원>
          <directory> src / main / resources </ directory>
          <filtering> true </ filtering>
        </ resource>
      </ resources>
    </ build>

당신은 또한 같은 다른 표준 속성을 얻을 수 있습니다 project.name, project.description당신이 당신의 치어에 넣어 또는 임의의 속성 <properties>, 메이븐 프로파일과 결합 등 자원 필터링, 당신에게 빌드시 변수 빌드 동작을 제공 할 수 있습니다. 로 런타임에 프로필을 지정하면 -PmyProfile빌드에 표시 될 수있는 속성을 활성화 할 수 있습니다.


답변

허용되는 답변은 정적으로 응용 프로그램에 버전 번호를 가져 오는 가장 안정적이고 가장 좋은 방법 일 수 있지만 실제로 원래 질문에 대답하지는 않습니다. pom.xml에서 아티팩트의 버전 번호를 검색하는 방법은 무엇입니까? 따라서 런타임 중에 동적으로 수행하는 방법을 보여주는 대안을 제공하고 싶습니다 .

Maven 자체를 사용할 수 있습니다. 보다 정확하게는 Maven 라이브러리를 사용할 수 있습니다.

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>3.3.9</version>
</dependency>

그런 다음 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());
    }
}

콘솔 로그는 다음과 같습니다.

de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT

2017-10-31 업데이트 : Simon Sobisch의 후속 질문에 답변하기 위해 다음과 같이 예제를 수정했습니다.

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());
  }
}


답변

패키지화 된 아티팩트에는 META-INF/maven/${groupId}/${artifactId}/pom.properties컨텐츠가 다음과 같은 파일이 있습니다.

#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang

많은 응용 프로그램은이 파일을 사용하여 런타임에 응용 프로그램 / jar 버전을 읽습니다. 설정이 필요 없습니다.

위의 접근 방식의 유일한 문제는이 파일이 현재 package단계에서 생성 되어 테스트 중에 존재하지 않는다는 것입니다 (이를 변경하는 Jira 문제가 있습니다 ( MJAR-76 참조 )). 이것이 당신에게 문제가된다면, Alex가 설명한 접근법이 갈 길입니다.


답변

Maven을 사용하여 앱 버전 번호를 표시하는 쉬운 방법에 설명 된 방법도 있습니다 .

이것을 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>

그런 다음 이것을 사용하십시오 :

App.class.getPackage().getImplementationVersion()

이 방법이 더 간단하다는 것을 알았습니다.


답변

jar 또는 war와 같은 mvn 패키징을 사용하는 경우 다음을 사용하십시오.

getClass().getPackage().getImplementationVersion()

아카이브에서 생성 된 META-INF / MANIFEST.MF (pom.xml의 버전으로 설정)의 “Implementation-Version”속성을 읽습니다.


답변

@kieste가 게시 한 내용을 보완하기 위해 Spring-boot를 사용하는 경우 Maven이 코드에서 사용할 수있는 정보를 빌드하는 가장 좋은 방법이라고 생각합니다 : http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info 는 매우 유용합니다.

당신은 단지 활성화 액츄에이터해야하고, 당신이 필요로하는 속성을 추가하여 application.properties또는application.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@


답변

간단한 솔루션을 위해이 라이브러리를 사용하십시오. 필요한 것을 매니페스트에 추가 한 다음 문자열로 쿼리하십시오.

 System.out.println("JAR was created by " + Manifests.read("Created-By"));

http://manifests.jcabi.com/index.html