Truy cập các thuộc tính maven được xác định trong pom


80

Làm cách nào để truy cập các thuộc tính maven được xác định trong pom trong một dự án maven bình thường và trong một dự án plugin maven?


1
Những loại thông tin bạn quan tâm? Nếu đó chỉ là các phiên bản hoặc những thứ tương tự, thì có lẽ tốt hơn bạn nên đặt nó vào tệp kê khai và đọc nó từ đó .
Joachim Sauer

1
Có rất nhiều bài đăng trong Stack Overflow về điều này: stackoverflow.com/search?q=read+pom+in+java , ít nhất, hãy xem trước khi đăng. SO chỉnh sửa người trợ giúp nên hiển thị chúng. Google cũng vậy.
Jean-Rémy Revy

Cảm ơn các bạn. Bây giờ tôi nhận ra đây là thực hành thực sự tồi tệ. Sẽ thử cách tiếp cận khác.
SparedWhisle,

Câu trả lời:


76

Sử dụng thuộc tính-maven-plugin để ghi pom cụ thể propertiesvào một tệp tại thời điểm biên dịch, sau đó đọc tệp đó tại thời điểm chạy.

Trong pom.xml của bạn :

<properties>
     <name>${project.name}</name>
     <version>${project.version}</version>
     <foo>bar</foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Và sau đó trong .java :

java.io.InputStream is = this.getClass().getResourceAsStream("my.properties");
java.util.Properties p = new Properties();
p.load(is);
String name = p.getProperty("name");
String version = p.getProperty("version");
String foo = p.getProperty("foo");

Điều đó đã hiệu quả, nhưng làm cho Eclipse rơi vào vòng lặp xây dựng / triển khai đến Tomcat vô hạn (xây dựng -> tạo my.properties -> tài nguyên đã thay đổi -> xây dựng), vì vậy tôi phải chuyển giai đoạn sang compile. Tuy nhiên, không chắc đó có phải là giải pháp thích hợp hay không.
Nikita Bosik

@atoregozh đã đề xuất sử dụng Guava Resource's thay thế để tải tệp thuộc tính. ĐỒNG Ý. Nhưng đã hoàn nguyên thay đổi để giữ cho ví dụ này ở mức tối thiểu với API tiêu chuẩn.
Leif Gruenwoldt

2
Hiện đã có phiên bản 1.0.0 ổn định
Pieter De Bie

25

Thiết lập biến Hệ thống từ Maven và trong java sử dụng lệnh gọi sau

System.getProperty("Key");

7
Điều này sẽ chỉ hoạt động nếu bạn đang chạy bản dựng kết quả từ Maven, có lẽ bằng cách sử dụng plugin maven-executive. Nếu bạn chỉ đang sử dụng Maven để biên dịch mã, điều này sẽ không hoạt động.
David Pashley,

@DavidPashley, điều đó đúng. Trong trường hợp chỉ biên dịch, tôi đoán biến cần phải được đặt từ plugin trình biên dịch.
Santosh


5

Maven đã có một giải pháp để làm những gì bạn muốn:

Nhận MavenProject chỉ từ trình phân tích cú pháp POM.xml - pom?

btw: lần đầu tiên truy cập vào tìm kiếm của google;)

Model model = null;
FileReader reader = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

try {
     reader = new FileReader(pomfile); // <-- pomfile is your pom.xml
     model = mavenreader.read(reader);
     model.setPomFile(pomfile);
}catch(Exception ex){
     // do something better here
     ex.printStackTrace()
}

MavenProject project = new MavenProject(model);
project.getProperties() // <-- thats what you need

1
Các câu trả lời liên kết đơn không được khuyến khích ở đây (chủ yếu là vì chúng có thể trở nên vô dụng khi tài nguyên được liên kết biến mất). Ít nhất bạn nên tóm tắt thông tin từ liên kết để đăng ở đây.
Joachim Sauer

2
Đây thực sự là một thực hành rất tệ, chỉ cần sử dụng plugin tài nguyên maven!
Mark Bakker vào

1
Tại sao điều này lại là một hành động xấu nếu anh ta muốn truy cập các thuộc tính từ mã java?
SWoeste

1
Nhưng chỉ khi bạn cho rằng anh ấy muốn / có thể thay đổi (các) pom của mình. Tôi đồng ý với bạn rằng có thể không tốt nếu có các thuộc tính trực tiếp trong tệp pom thay vì tệp bên ngoài. Tệp đó có thể được đọc với lớp thuộc tính java - chắc chắn. Nhưng trong trường hợp khác thì sao? Sau đó, mô hình maven là giải pháp tốt nhất để thực hiện thủ thuật ... nhưng trước khi David Dai không cho chúng ta biết chính xác anh ta muốn làm gì, tất cả chúng ta chỉ đang phỏng đoán.
SWoeste

1
Tôi cũng hiểu rằng chúng tôi có một tệp pom mvn (chứa các thuộc tính) và một ứng dụng java (từ đó chúng tôi muốn đọc chi tiết của tệp pom đó). Mà không thực sự chạy maven.
Andreas Dolk,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.