수색…


소개

코드에서 현재 버전과 같은 maven 속성을 가져 오는 것이 때때로 유용합니다. 여기에 몇 가지 방법이 있습니다.

항아리 내에서 버전 번호 가져 오기

maven-jar-plugin 이나 maven-assembly-plugin 사용하여 jar 응용 프로그램을 패키징하는 경우 현재 pom 버전을 쉽게 얻을 수있는 방법은 매니페스트에 항목을 추가하는 것입니다.이 항목은 Java에서 사용할 수 있습니다.

비밀은 addDefaultImplementationEntries 플래그를 true로 설정하는 addDefaultImplementationEntries 입니다 (또한 addDefaultSpecificationEntries 는 이슈 ID가 필요합니다).

jar 플러그인 구성 :

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>...</mainClass>
            <addDefaultImplementationEntries>
              true
            </addDefaultImplementationEntries>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

어셈블리 플러그인 구성 :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>  
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution .../>
    </executions>
</plugin>

addDefaultImplementationEntriesMANIFEST.MF 에 다음 헤더를 추가하도록 Maven에 지시합니다.

Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test

이제이 코드 줄을 항아리 어디에서나 사용하여 버전 번호에 액세스 할 수 있습니다.

getClass().getPackage().getImplementationVersion()

여기여기에 더 많은 정보가 있습니다 .

Maven의 속성 필터링 메카니즘을 사용하여 속성 파일을 동기화 상태로 유지

이 문서에서 설명하는 것처럼,

때때로 리소스 파일은 빌드시에만 제공 될 수있는 값을 포함해야합니다. 이를 Maven에서 수행하려면 ${<property name>} 구문을 사용하여 값을 포함 할 속성에 대한 참조를 리소스 파일에 넣습니다. 이 속성은 pom.xml 에 정의 된 값, 사용자의 settings.xml 정의 된 값, 외부 속성 파일에 정의 된 속성 또는 시스템 속성 중 하나 일 수 있습니다.

예를 들어, pom 버전과 빌드 타임을 포함하는 src/main/resources 에 간단한 info.txt 를 생성 해보자.

  1. 다음 내용으로 src/main/resources/info.txt 를 만듭니다.

    version = $ {pom.version} build.date = $ {timestamp}

  2. filtering 을 true로 설정하여 Maven에 속성을 확장 해 줄 것을 요청하십시오.

     <build>
         <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    
  3. 버전이 업데이트 될 예정이지만 불행히도 Maven 내의 버그로 인해 ${maven.build.timestamp} 속성이 리소스 필터링 메커니즘 (자세한 내용은 여기 )으로 전달되지 않습니다. 그러므로 임시 해결책으로 timestamp 속성을 만들어 봅시다! POM의 속성에 다음을 추가합니다.

     <properties>
         <timestamp>${maven.build.timestamp}</timestamp>
         <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format>  
     </properties>
    
  4. maven을 실행하면 다음과 같은 내용으로 target/classes info.txt 가 있어야합니다.

     version=0.3.2
     build.date=2017-04-20T13:56
    

Maven-model plugin을 사용하여 런타임시 pom.xml 읽기

다른 예제는 응용 프로그램에 정적으로 버전 번호를 가져 오는 가장 안정적인 방법 일 수 있습니다. 이 답변 은 Maven Maven 모델 라이브러리를 사용하여 런타임 중에 동적으로 수행하는 방법을 보여주는 대안을 제시합니다.

종속성 추가 :

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

Java에서는 MavenXpp3Reader 을 읽을 MavenXpp3Reader 를 만듭니다. 예 :

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 MavenModelExample {
    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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow