코드의 maven pom.xml에서 버전을 가져옵니다.
maven's pom.xml에서 코드, 즉 프로그램적으로 버전 번호를 취득하는 가장 간단한 방법은 무엇입니까?
Java 를 사용하고 있는 경우는, 다음과 같이 할 수 있습니다.
작성하다
.properties
( 일반적인)src/main/resources
디렉토리(단, 순서 4에서는 다른 곳을 참조하도록 지시할 수 있습니다).을 설정합니다.
.properties
프로젝트 버전에 대해 표준 Maven 속성을 사용하여 파일을 작성합니다.foo.bar=${project.version}
Java 코드에서 속성 파일의 값을 클래스 경로의 리소스로 로드합니다(구글에서 이 작업을 수행하는 방법을 자세히 알아보려면 여기를 참고하십시오).
Maven에서 리소스 필터링을 활성화합니다.그러면 Maven이 해당 파일을 출력 클래스에 복사하고 복사 중에 리소스를 변환하여 속성을 해석합니다.여기서 몇 가지 정보를 찾을 수 있지만 대부분 폼에서 이렇게 합니다.
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
볼 수 있습니다.project.name
,project.description
폼에 을 넣을 <properties>
리소스 필터링을 Maven 프로파일과 결합하여 빌드 시 가변 빌드 동작을 제공할 수 있습니다. 시 한 경우.-PmyProfile
를 사용하면 빌드에 속성을 표시할 수 있습니다.
받아들여지는 답변은 어플리케이션에 버전 번호를 정적으로 가져오는 가장 안정적이고 최선의 방법일 수 있지만, 실제로는 원래의 질문에 대답하지 않습니다.pom.xml에서 아티팩트의 버전 번호를 가져오려면 어떻게 해야 합니까?따라서 런타임 중에 동적으로 수행하는 방법을 보여 주는 대안을 제시하고자 합니다.
메이븐 자체를 사용할 수 있습니다.정확히는 메이븐 라이브러리를 사용할 수 있습니다.
<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 참조).만약 이것이 당신에게 문제가 된다면, 알렉스가 설명한 접근방식이 최선입니다.
또한 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의 속성 "Implementation-Version"을 읽습니다.아카이브의 MF(pom.xml 버전으로 설정)
Spring-boot을 사용하는 경우 Maven이 코드로 빌드 정보를 이용할 수 있도록 하는 가장 좋은 방법인 @kieste의 글을 보완하기 위해: 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@
프로젝트 버전과 관련된 내용을 스크립팅할 때 Maven 명령줄로 충분할 수 있습니다(예: 저장소에서 URL을 통해 아티팩트를 검색하는 경우:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
사용 예:
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
스프링 부트를 사용할 경우 다음 링크가 도움이 될 수 있습니다.https://docs.spring.io/spring-boot/docs/2.3.x/reference/html/howto.html#howto-properties-and-configuration
spring-boot-starter-parent를 사용하는 경우 응용 프로그램 구성 파일에 다음 항목만 추가하면 됩니다.
# get values from pom.xml
pom.version=@project.version@
그 후 다음과 같이 값을 사용할 수 있습니다.
@Value("${pom.version}")
private String pomVersion;
이 라이브러리를 사용하면, 심플한 솔루션을 간단하게 이용할 수 있습니다.매니페스트에 필요한 내용을 추가한 다음 문자열로 쿼리합니다.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
http://manifests.jcabi.com/index.html
<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>
를 사용하여 .this.getClass().getPackage().getImplementationVersion()
추신, 잊지 말고 추가해 주세요.
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
스텝 1: Spring Boot을 사용하는 경우 pom.xml에 이미 spring-boot-maven-plugin이 포함되어 있어야 합니다.다음 구성만 추가하면 됩니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-info</id>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
기본적으로 실행되지 않는 빌드 정보 목표도 실행하도록 플러그인에 지시합니다.그러면 아티팩트 버전, 빌드 시간 등을 포함하는 애플리케이션에 대한 빌드 메타 데이터가 생성됩니다.
순서 2: build Properties bean을 사용하여 빌드 속성에 액세스합니다.이 경우 webapp에서 이 빌드 정보에 액세스할 restResource를 만듭니다.
@RestController
@RequestMapping("/api")
public class BuildInfoResource {
@Autowired
private BuildProperties buildProperties;
@GetMapping("/build-info")
public ResponseEntity<Map<String, Object>> getBuildInfo() {
Map<String, String> buildInfo = new HashMap();
buildInfo.put("appName", buildProperties.getName());
buildInfo.put("appArtifactId", buildProperties.getArtifact());
buildInfo.put("appVersion", buildProperties.getVersion());
buildInfo.put("appBuildDateTime", buildProperties.getTime());
return ResponseEntity.ok().body(buldInfo);
}
}
이게 도움이 됐으면 좋겠다
낮에도 같은 문제가 있었어요.많은 답변이 특정 아티팩트의 버전을 찾는 데 도움이 되지만 애플리케이션의 직접적인 종속성이 아닌 모듈/자르 버전을 입수해야 했습니다.클래스 패스는 응용 프로그램이 시작될 때 여러 모듈에서 조립됩니다. 메인 응용 프로그램모듈은 나중에 추가되는 jar의 수를 인식하지 못합니다.
그래서 다른 솔루션을 생각해 냈습니다.이 솔루션은 jar 파일에서 XML이나 속성을 읽는 것보다 조금 더 우아할 수 있습니다.
아이디어
- Java 서비스 로더 접근 방식을 사용하여 나중에 컴포넌트/아티팩트를 추가할 수 있습니다.이러한 컴포넌트/아티팩트를 추가할 수 있습니다.코드 몇 줄만으로 클래스 경로의 모든 아티팩트 버전을 읽고, 찾고, 필터링하고, 정렬할 수 있는 매우 가벼운 라이브러리를 만듭니다.
- 컴파일 시 각 모듈에 대한 서비스 구현을 생성하는 maven 소스 코드 생성 플러그인을 만들고 각 jar에 매우 간단한 서비스를 패키지합니다.
해결 방법
의 첫 은 '일부일부일부문은 '일부'입니다.artifact-version-service
현재 Github과 MavenCentral에서 찾을 수 있는 라이브러리입니다.서비스 정의와 런타임에 아티팩트 버전을 가져오는 몇 가지 방법에 대해 설명합니다.
는 '2'입니다.artifact-version-maven-plugin
Github 및 MavenCentral에서도 찾을 수 있습니다.각 아티팩트에 대한 서비스 정의를 구현하는 번거로움이 없는 발전기를 사용하는 데 사용됩니다.
예
좌표가 있는 모든 모듈을 가져오는 중
더 이상 판독용 항아리가 표시되지 않고 간단한 메서드 호출만 가능합니다.
// iterate list of artifact dependencies
for (Artifact artifact : ArtifactVersionCollector.collectArtifacts()) {
// print simple artifact string example
System.out.println("artifact = " + artifact);
}
정렬된 아티팩트 세트가 반환됩니다.정렬 순서를 변경하려면 사용자 정의 비교기를 제공합니다.
new ArtifactVersionCollector(Comparator.comparing(Artifact::getVersion)).collect();
이렇게 하면 아티팩트 목록이 버전 번호별로 정렬되어 반환됩니다.
특정 아티팩트 찾기
ArtifactVersionCollector.findArtifact("de.westemeyer", "artifact-version-service");
특정 아티팩트의 버전 세부 정보를 가져옵니다.
일치하는 groupId를 가진 아티팩트 찾기
groupId를 가진 합니다.de.westemeyer
일치 (일치 일치):
ArtifactVersionCollector.findArtifactsByGroupId("de.westemeyer", true);
groupId가 다음 문자로 시작하는 모든 아티팩트를 찾습니다. de.westemeyer
:
ArtifactVersionCollector.findArtifactsByGroupId("de.westemeyer", false);
버전 번호별로 결과 정렬:
new ArtifactVersionCollector(Comparator.comparing(Artifact::getVersion)).artifactsByGroupId("de.", false);
아티팩트 목록에 사용자 지정 작업 구현
람다를 제공함으로써 첫 번째 예는 다음과 같이 구현될 수 있습니다.
ArtifactVersionCollector.iterateArtifacts(a -> {
System.out.println(a);
return false;
});
인스톨
두 를 모든 에 추가합니다.pom.xml
파일이나 회사 마스터 폼으로 보낼 수도 있습니다.
<build>
<plugins>
<plugin>
<groupId>de.westemeyer</groupId>
<artifactId>artifact-version-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<goals>
<goal>generate-service</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>de.westemeyer</groupId>
<artifactId>artifact-version-service</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
피드백
아마 몇몇 사람들이 그 해결책을 시도할 수 있다면 좋을 것이다.고객의 요구에 맞는 솔루션인지 아닌지에 대한 피드백을 받는 것은 더욱 좋습니다.따라서 제안, 기능 요청, 문제 등이 있으면 주저하지 말고 GITHub 프로젝트에 새로운 이슈를 추가해 주십시오.
라이선스
모든 소스 코드는 오픈 소스이며, 상용 제품(MIT 라이센스)에서도 자유롭게 사용할 수 있습니다.
케탕크의 답변과 관련하여:
유감스럽게도, 이것을 추가하면, 애플리케이션의 자원 처리 방법이 엉망이 되어 버렸습니다.
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
그러나 이 내부 maven-assembly-plugin의 <매니페스트> 태그를 사용하면 다음과 같은 효과를 얻을 수 있습니다.
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
그래서 버전도 구할 수중에 넣었습니다.
String version = getClass().getPackage().getImplementationVersion();
서문:몇 년 전에 Maven POM infos에 동적으로 액세스하는 동적 버전을 보여 준 후 자주 언급되는 질문이 생각나기 때문에 오늘 다른 모듈 B에서 모듈 A의 Maven 정보에 액세스하는 것과 관련된 유사한 질문을 발견했습니다.
잠시 고민하다가 자연스럽게 특별한 주석을 사용하여 패키지 선언에 적용하고 GitHub에서 멀티모듈 예시 프로젝트를 만들었습니다.전체 답변을 반복하고 싶지 않으므로 이 답변에서 솔루션 B를 참조하십시오.Maven 셋업에는 Maven 플러그인의 템플레이팅이 포함되지만 리소스 필터링과 빌드 도우미 Maven을 통한 빌드에 생성된 소스 디렉토리를 추가하는 조합으로 보다 상세한 방법으로 해결할 수도 있습니다.그걸 피하고 싶어서 템플레이팅 메이븐을 사용했어요.
언급URL : https://stackoverflow.com/questions/3697449/retrieve-version-from-maven-pom-xml-in-code
'programing' 카테고리의 다른 글
술어로 첫 번째 요소 찾기 (0) | 2022.08.03 |
---|---|
Java Enum 정의 (0) | 2022.08.03 |
Java 코드에서 Unix 쉘 스크립트를 실행하는 방법 (0) | 2022.08.03 |
VueJS 디스패치 기능의 실행 순서에서 문제가 발생하고 있습니다. (0) | 2022.08.03 |
모달 vue에서 윈도우 프린트를 사용하려면 어떻게 해야 하나요? (0) | 2022.08.03 |