我做的 :-)
help:有效pom和依赖关系:tree根本 没有 帮助。
我必须看一下maven如何为注入到mojo中的MavenProject构建模型。help:effective-
pom已经收到了解析的模型,并且dependency:tree仅构建了一个DependencyGraph,但没有将整个pom模型加载到内存中。
通过使用下面的代码,我可以从父级获取所有Model的Model对象,并带有已解析的$ {property}表达式和扩展的传递依赖项。
这是如何做:
1)获取一个ModelResolver
您将需要 接口org.apache.maven.model.resolution.ModelResolver
的实例。不幸的是,maven不能通过依赖注入轻松地提供一个(至少我找不到一个),因此我们必须构建一个。为了使事情变得更好,该接口的仅有两个实现受到程序包保护,因此您需要使用一些反射魔术来实例化它。实现它的具体类是
DefaultModelResolver 和 ProjectModelResolver
。我能够像这样建立一个DefaultModelResolver
protected MavenProject project;protected ArtifactResolver artifactResolver;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)建立模型
当您拥有modelResolver时,您可以像这样从pom文件构建模型:
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;}
看起来不漂亮,但是对我有用。.:P
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)