java 이클립스 - 코드에서 maven pom.xml에서 버전 검색




메이븐 snapshot이란 (7)

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


Answers

또한 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"속성을 읽습니다.


자바를 사용한다고 가정하면

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

  2. 프로젝트 버전에 대한 표준 Maven 속성을 사용하여 .properties 파일의 일부 속성 값을 설정합니다. foo.bar=${project.version}

  3. Java 코드에서 특성 파일의 값을 클래스 경로에서 자원으로로드하십시오 (이를 수행하는 방법에 대한 자세한 내용은 google을 참고 하십시오 ).

  4. Maven에서 리소스 필터링을 활성화합니다. Maven이 해당 파일을 출력 클래스에 복사하고 해당 복사본을 만드는 동안 리소스를 변환하여 속성을 해석합니다. here 몇 가지 정보를 찾을 수 있지만 주로 POM에서이 작업을 수행합니다.

    <build>
      <resources>
        <resource>
          <directory>src/main/resources</directory>
          <filtering>true</filtering>
        </resource>
      </resources>   
    </build>

또한 project.name , project.description 또는 pom <properties> 등에 넣은 임의의 속성과 같은 다른 표준 속성을 사용할 수도 있습니다. Maven 프로파일과 결합 된 자원 필터링은 빌드시 가변적 인 빌드 동작을 제공 할 수 있습니다. -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.:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.
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./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());
  }
}

이 라이브러리를 사용하면 간단한 솔루션을 쉽게 사용할 수 있습니다. 필요에 따라 매니페스트를 추가 한 다음 문자열로 쿼리하십시오.

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

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


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

액추에이터를 활성화하고 application.properties 또는 application.yml 필요한 속성을 추가하면 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 @[email protected] placeholders, e.g.

project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
[email protected]@
[email protected]@
[email protected]@
[email protected]@

Mac에서도 비슷한 상황이었고 다음 프로세스가 유용했습니다.

터미널에서 다음을 입력하십시오.

vi ~/.profile

그런 다음이 줄을 파일에 추가하고 저장하십시오.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

여기서 버전은 1.7.0_25 와 같이 컴퓨터의 버전입니다.

편집기를 종료하고 다음 명령을 입력하여 효과적으로 만드십시오.

source ~/.profile 

그런 다음 결과를 확인하려면 java -version을 입력하십시오.

java -version 

.profile 파일이란 무엇입니까?

.profile 파일은 숨겨진 파일입니다. 프로필 파일이있는 사용자가 로그인 할 때 실행할 명령을 시스템에 알려주는 선택적 파일입니다. 예를 들어, 내 사용자 이름이 bruno이고 / Users / bruno /에 .profile 파일이 있으면 그 모든 내용 로그인 절차 중에 실행됩니다.

출처 : http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515







java maven-2 version