2010-01-25 70 views
17

Trong dự án công việc của tôi, gần đây tôi đã được yêu cầu tạo tệp POM qua lớp java. Vấn đề là tôi rất, rất mới với Maven (như kể từ tháng 12 năm ngoái).Có một Lớp Java tạo tệp POM.xml không?

Điều tôi cần là mã nào đó tạo tệp xml (tệp pom, nhưng nếu tôi có thể định cấu hình bất kỳ mã tạo xml nào sẽ ổn) cho tất cả dữ liệu cần thiết, vì vậy chúng không cần viết bằng tay. Tôi không biết nếu tôi giải thích bản thân mình, nhưng câu hỏi là, có bất kỳ thư viện hoặc lớp học mà tạo ra hoặc xây dựng một tập tin POM với một dữ liệu nhất định? Nếu không tốt, tôi không muốn mất nhiều thời gian tìm kiếm thứ gì đó mà tôi không biết nếu nó còn tồn tại hoặc đơn giản như khai báo đối tượng POM và sau đó thực hiện một tài liệu tầm thường d = generatePom (POM p). Vì không ai phàn nàn về việc viết các file POM như thế nào, tôi cho rằng đó là một cách dễ dàng để thực hiện chúng nhưng tôi nghĩ rằng mình đã mất rất nhiều API javadoc và tôi không thể tìm được đường trở lại.

Ý tưởng của tôi nếu không có mã cho điều này là tìm kiếm từ điển POM (để bao gồm tất cả các phần tử) và tạo tệp xml với đối tượng POM đã cho (trước đây tôi đã điền dữ liệu tôi cung cấp), sử dụng trình tạo XML như JDOM, XOM hoặc XStream. Bất kỳ suy nghĩ về điều này sẽ được đánh giá cao nếu không có lớp học mà đã làm điều này (như 'hey! Bạn đang làm nó WRONG').

PS: Tôi đã đọc rằng dự án Eclipse đang thực hiện một số điều Maven và có API tạo tệp pom.xml cho dự án thực tế mà bạn có. Đó sẽ là một điều tuyệt vời nếu tôi có thể ghi đè lên dữ liệu đầu vào hoặc một cái gì đó.

Cảm ơn tất cả!

Trả lời

37

Tùy thuộc vào những gì bạn đang cố gắng làm. Nếu bạn chỉ muốn tạo POM cho các dự án mới của một kiểu chắc chắn, cách tốt nhất là thông qua các nguyên mẫu Maven (bạn có thể tạo các kiểu mẫu của riêng bạn với các mẫu mà bạn muốn).

Nếu bạn thực sự có nhu cầu lập trình viết một POM, bạn có thể sử dụng như sau:

import org.apache.maven.model.*; 
import org.apache.maven.model.io.xpp3.MavenXpp3Writer; 
... 
Model model = new Model(); 
model.setGroupId("some.group.id"); 
... 
new MavenXpp3Writer().write(w, model); 

... nơi w là một java.io.Writer và bạn thêm tất cả các xử lý ngoại lệ cần thiết.

Các Javadoc là ở đây: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

Để truy cập vào API này, bạn nên thêm phụ thuộc này:

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

Có một API đọc tương ứng là tốt, nhưng hãy nhớ rằng nó sẽ không làm tất cả các hoạt động Maven như kế thừa và nội suy (để thực hiện điều đó đòi hỏi phải sử dụng API nâng cao hơn).

+0

Wow! Ý tôi là ... đó thực sự là những gì tôi đang tìm kiếm. Tôi thực sự chỉ có thể làm tất cả các setters và viết file pom.xml bất cứ nơi nào tôi muốn. Tôi đã thử một chút thư viện này và dường như làm điều kỳ diệu. Rất cảm ơn! :) – Random

+3

Nếu bạn tự hỏi Brett biết điều này như thế nào, đó là vì ông đã viết Apache Maven2: Thực hiện hiệu quả: http://brettporter.wordpress.com/ –

+0

Điều này thật tuyệt vời. Cảm ơn rất nhiều vì gợi ý này. Thư viện này khá hữu dụng ... !!! –

1

Tại sao bạn phải làm điều đó trong java thay vì sử dụng một công cụ hiện có như m2eclipse.
Xem guide để tạo POM cho dự án hiện có bằng m2eclipse.

Bạn cũng có thể xem số m2eclipse developer guide sẽ cho phép bạn xem mã nguồn để triển khai.

Trả lời ----
Đây là vấn đề phổ biến gặp phải khi cố gắng mavenise một dự án.
Trở ngại lớn nhất là cố gắng xác định chính xác maven coordinates.
Các dự án thường đề cập đến các tệp jar được đổi tên, trong đó số nhóm-id và số phiên bản đã bị loại bỏ.

Đôi khi kiểm tra tệp kê khai trong tệp jar cung cấp một số gợi ý về thành phần phụ thuộc chính xác.

+0

Ý tưởng không chỉ để tạo tệp pom.xml của dự án mà tôi đang làm việc mà còn tạo tệp pom.xml của bất kỳ dự án nào. Tôi hiểu rằng họ lưu trữ dữ liệu cần thiết và sau đó đưa nó cho tôi để tạo ra pom. Tôi không biết cách họ lưu trữ dữ liệu này (hoặc tại sao họ không tạo ra một pom thay vì lưu trữ nó) Tôi chỉ biết rằng tôi phải recive nó (hurray modular bussines). Cảm ơn bạn đã hướng dẫn tôi sẽ xem xét những gì tôi có thể làm với mã của họ :) – Random

+0

Cảm ơn bạn đã gửi lời khuyên :) Mặc dù tôi được cung cấp dữ liệu này vì vậy tôi hy vọng rằng chúng đúng và thực. Dù sao, tôi sẽ có vấn đề với Maven tọa độ sau đó tôi sẽ kiểm tra làm thế nào dữ liệu được đưa ra và tôi suposse nó sẽ là một số loại vấn đề kết nối (nhưng tôi hy vọng rằng không xảy ra!). Câu trả lời được đưa ra bởi Brett Porter chỉ là những gì tôi thực sự cần. Tôi thực sự hy vọng không có vấn đề gì nữa :) – Random

3
 MavenXpp3Reader reader = new MavenXpp3Reader(); 
     Model pomModel = reader.read(new FileReader(pomLibFile)); 
     final List<Dependency> dependencies= pomModel.getDependencies(); 
     final List<String> modules= pomModel.getModules(); 
     final List<Profile> profiles = pomModel.getProfiles(); 

     InputStream inputStream = new FileInputStream(new File(pomLibFile)); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(inputStream, writer, "utf-8"); 
     pomModel.getDependencyManagement(); 
     final Properties properties = new Properties(); 
     properties.load(new FileInputStream(pomProperties)); 
     RegexBasedInterpolator interpolator = new RegexBasedInterpolator(); 

     interpolator.addValueSource(new EnvarBasedValueSource()); 
     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     List<String> synonymPrefixes = new ArrayList<String>(); 
     synonymPrefixes.add("project."); 
     synonymPrefixes.add("pom."); 

     PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper(new ObjectBasedValueSource(pomModel),synonymPrefixes, true); 
     interpolator.addValueSource(modelWrapper); 

     PrefixedValueSourceWrapper pomPropertyWrapper = 
       new PrefixedValueSourceWrapper(new PropertiesBasedValueSource(pomModel.getProperties()), synonymPrefixes, true); 
     interpolator.addValueSource(pomPropertyWrapper); 

     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor(synonymPrefixes, true); 

     String serializedPOM = interpolator.interpolate(writer.toString(), recursionInterceptor); 
     System.out.println("-------- "+serializedPOM);; 

tham khảo: http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html

mặc dù tôi vẫn còn bị mắc kẹt nếu tôi có thêm nhiều (số không rõ các) phụ thuộc.

Các vấn đề liên quan