tôi đã làm nó :-)
giúp đỡ: hiệu quả-pom và phụ thuộc: cây thực sự đã không giúp đỡ ở tất cả.
tôi phải xem xét cách maven xây dựng mô hình cho MavenProject đó được tiêm vào mojo. trợ giúp: hiệu quả-pom đã nhận được mô hình giải quyết, và phụ thuộc: cây chỉ xây dựng một DependencyGraph, nhưng nó không tải toàn bộ mô hình cho một pom vào bộ nhớ.
Bằng việc sử dụng mã dưới đây tôi đã có thể để có được một đối tượng mẫu với tất cả các thông tin từ phụ huynh, với $ giải quyết {thuộc tính} biểu thức, và phụ thuộc bắc cầu mở rộng.
Đây là cách:
1) Nhận một ModelResolver
Bạn sẽ cần một thể hiện của giao diện org.apache.maven.model.resolution.ModelResolver. Thật không may, maven không cung cấp một cách dễ dàng thông qua tiêm phụ thuộc (ít nhất là tôi không thể tìm thấy một), vì vậy chúng tôi sẽ phải xây dựng một. Để làm cho mọi thứ trở nên tốt hơn, chỉ có hai triển khai thực hiện của giao diện đó được bảo vệ gói, vì vậy bạn cần sử dụng một số phép thuật phản chiếu để khởi tạo nó. Các lớp cụ thể triển khai thực hiện là DefaultModelResolver và ProjectModelResolver. tôi đã có thể xây dựng một DefaultModelResolver như thế này
/**
* The Maven Project Object
*
* @parameter expression="${project}"
* @required2.0
* @readonly
*/
protected MavenProject project;
/**
* @component
*/
protected ArtifactResolver artifactResolver;
/**
* @component
*/
protected RemoteRepositoryManager remoteRepositoryManager;
private Object invoke(Object object, String method)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
return object.getClass().getMethod(method).invoke(object);
}
private org.apache.maven.model.resolution.ModelResolver makeModelResolver() throws MojoExecutionException {
try {
ProjectBuildingRequest projectBuildingRequest =
(ProjectBuildingRequest) invoke(project, "getProjectBuildingRequest");
Class c = Class.forName("org.apache.maven.repository.internal.DefaultModelResolver");
Constructor ct = c.getConstructor(new Class[]{RepositorySystemSession.class,
RequestTrace.class, String.class,
ArtifactResolver.class, RemoteRepositoryManager.class,
List.class});
ct.setAccessible(true);
return (org.apache.maven.model.resolution.ModelResolver) ct.newInstance(new Object[]{
projectBuildingRequest.getRepositorySession(),
null, null, artifactResolver, remoteRepositoryManager,
project.getRemoteProjectRepositories()});
} catch (Exception e) {
throw new MojoExecutionException("Error instantiating DefaultModelResolver", e);
}
}
2) Xây dựng mô hình
Khi bạn có một modelResolver, bạn có thể xây dựng mô hình từ một tập tin pom như thế này:
public Model resolveEffectiveModel(File pomfile) {
try {
return modelBuilder.build(makeModelBuildRequest(pomfile)).getEffectiveModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private ModelBuildingRequest makeModelBuildRequest(File artifactFile) {
DefaultModelBuildingRequest mbr = new DefaultModelBuildingRequest();
mbr.setPomFile(artifactFile);
mbr.setModelResolver(modelResolver); // <-- the hard-to-get modelResolver
return mbr;
}
Không đẹp, nhưng nó có hiệu quả đối với tôi ..: P
Bạn có thể giải thích một chút về các quy tắc xác thực không? – khmarbaise