Câu trả lời:
Giả sử bạn đang sử dụng Java, bạn có thể
Tạo một .properties
tệp trong (phổ biến nhất) src/main/resources
thư mục của bạn (nhưng trong bước 4, bạn có thể yêu cầu nó tìm ở nơi khác).
Đặt giá trị của một số thuộc tính trong .properties
tệp của bạn bằng thuộc tính Maven tiêu chuẩn cho phiên bản dự án: foo.bar=${project.version}
Trong mã Java của bạn, tải giá trị từ tệp thuộc tính dưới dạng tài nguyên từ đường dẫn lớp (google cho các ví dụ đa dạng về cách thực hiện việc này, nhưng đây là một ví dụ cho người mới bắt đầu ).
Trong Maven, cho phép lọc tài nguyên - điều này sẽ khiến Maven sao chép tệp đó vào các lớp đầu ra của bạn và dịch tài nguyên trong quá trình sao chép đó, diễn giải thuộc tính. Bạn có thể tìm thấy một số thông tin ở đây nhưng bạn chủ yếu chỉ làm điều này trong pom của bạn:
<xây dựng> <tài nguyên> <tài nguyên> <thư mục> src / main / resource </ thư mục> <lọc> đúng </ lọc> </ tài nguyên> </ tài nguyên> </ xây dựng>
Bạn cũng có thể nhận được các thuộc tính tiêu chuẩn khác như project.name
, project.description
hoặc thậm chí các thuộc tính tùy ý bạn đặt trong pom của mình <properties>
, v.v. Lọc tài nguyên, kết hợp với cấu hình Maven, có thể cung cấp cho bạn hành vi xây dựng biến khi xây dựng. Khi bạn chỉ định một cấu hình trong thời gian chạy với -PmyProfile
, có thể kích hoạt các thuộc tính mà sau đó có thể hiển thị trong bản dựng của bạn.
src/main/resources
, vì điều này có thể xử lý tất cả các tệp nằm trong thư mục này, bao gồm các tệp nhị phân. Để tránh các hành vi không thể đoán trước, tốt hơn là thực hiện lọc trên một src/main/resources-filtered
thư mục, như được đề xuất ở đây . Dù sao, cảm ơn bạn cho thủ thuật tốt đẹp này!
Câu trả lời được chấp nhận có thể là cách tốt nhất và ổn định nhất để đưa số phiên bản vào ứng dụng một cách tĩnh , nhưng thực tế không trả lời câu hỏi ban đầu: Làm cách nào để lấy số phiên bản của tạo phẩm từ pom.xml? Vì vậy, tôi muốn đưa ra một giải pháp thay thế cho thấy cách thực hiện một cách linh hoạt trong thời gian chạy:
Bạn có thể sử dụng Maven chính nó. Để chính xác hơn, bạn có thể sử dụng thư viện Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Và sau đó làm một cái gì đó như thế này trong 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());
}
}
Nhật ký giao diện điều khiển như sau:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Cập nhật 2017-10-31: Để trả lời câu hỏi tiếp theo của Simon Sobisch, tôi đã sửa đổi ví dụ như thế này:
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 bình thường (các lớp phụ thuộc không được tích hợp) và không hoạt động khi được đóng gói với maven-assembly-plugin jar-with-dependencies
tôi nhận được a java.io.FileNotFoundException: pom.xml
(nó nằm trong bình cuối cùng như META-INF/maven/my.package/myapp/pom.xml
) - có gợi ý nào để giải quyết vấn đề này không?
Các tạo phẩm được đóng gói chứa một META-INF/maven/${groupId}/${artifactId}/pom.properties
tệp có nội dung như sau:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Nhiều ứng dụng sử dụng tệp này để đọc phiên bản ứng dụng / jar khi chạy, không cần thiết lập.
Vấn đề duy nhất với cách tiếp cận ở trên là tệp này (hiện tại) được tạo trong package
giai đoạn và do đó sẽ không có mặt trong các thử nghiệm, v.v. (có một vấn đề Jira để thay đổi điều này, xem MJAR-76 ). Nếu đây là một vấn đề cho bạn, thì cách tiếp cận được mô tả bởi Alex là cách để đi.
Ngoài ra còn có phương pháp được mô tả theo cách Dễ dàng để hiển thị số phiên bản ứng dụng của bạn bằng Maven :
Thêm phần này vào 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>
Sau đó sử dụng:
App.class.getPackage().getImplementationVersion()
Tôi đã tìm thấy phương pháp này để đơn giản hơn.
getImplementationVersion()
là null
. (phiên bản maven 3.0.4)
.war
các vật phẩm, hãy nhớ sử dụng maven-war-plugin
thay vìmaven-jar-plugin
getImplementationVersion()
trả về null).
Nếu bạn sử dụng bao bì mvn như bình hoặc chiến tranh, hãy sử dụng:
getClass().getPackage().getImplementationVersion()
Nó đọc một thuộc tính "Phiên bản triển khai" của META-INF / MANIFEST.MF được tạo (được đặt thành phiên bản của pom.xml) trong kho lưu trữ.
Để bổ sung cho những gì @kieste đã đăng, mà tôi nghĩ là cách tốt nhất để có thông tin xây dựng Maven có sẵn trong mã của bạn nếu bạn đang sử dụng Spring-boot: tài liệu tại http://docs.spring.io/spring-boot/ docs / current / Reference / htmlsingle / # sản xuất-ready-application-information rất hữu ích.
Bạn chỉ cần kích hoạt bộ truyền động và thêm các thuộc tính bạn cần trong application.properties
hoặcapplication.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@
Sử dụng Thư viện này để dễ dàng cho một giải pháp đơn giản. Thêm vào bảng kê khai bất cứ điều gì bạn cần và sau đó truy vấn theo chuỗi.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Đôi khi dòng lệnh Maven là đủ khi kịch bản một cái gì đó liên quan đến phiên bản dự án, ví dụ như để truy xuất giả tạo thông qua URL từ kho lưu trữ:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Ví dụ sử dụng:
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>
Nhận phiên bản bằng cách sử dụng this.getClass().getPackage().getImplementationVersion()
PS Đừng quên thêm:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Với tham chiếu đến câu trả lời của ketankk :
Thật không may, việc thêm này lại gây rối với cách ứng dụng của tôi xử lý các tài nguyên:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Nhưng sử dụng thẻ này trong thẻ <manifest> của maven-lắp ráp-plugin đã thực hiện thủ thuật:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Vì vậy, tôi đã có thể có được phiên bản bằng cách sử dụng
String version = getClass().getPackage().getImplementationVersion();