也许这将是一个比我最初想到的更大的任务,但不管我试图从一个文件加载一个MavenProject,然后解决它的依赖.我有两个代码,但我缺少一些我需要的对象引用;具体来说我需要获取RepositorySystemSession和RepositorySystem的实例.任何提示?
注意:我用maven-plugin标记了这个问题,但这不是一个Maven插件.我很高兴地要求Maven 3(认为我已经有了..)
以下是我到目前为止的代码:
构建MavenProject:
public static MavenProject loadProject(File pomFile) throws Exception { MavenProject ret = null; MavenXpp3Reader mavenReader = new MavenXpp3Reader(); if (pomFile != null && pomFile.exists()) { FileReader reader = null; try { reader = new FileReader(pomFile); Model model = mavenReader.read(reader); model.setPomFile(pomFile); ret = new MavenProject(model); } finally { // Close reader } } return ret; }
解决依赖关系:
public static List<Dependency> getArtifactsDependencies(MavenProject project,String dependencyType,String scope) throws Exception { DefaultArtifact pomArtifact = new DefaultArtifact(project.getId()); RepositorySystemSession repoSession = null; // TODO RepositorySystem repoSystem = null; // TODO List<RemoteRepository> remoteRepos = project.getRemoteProjectRepositories(); List<Dependency> ret = new ArrayList<Dependency>(); Dependency dependency = new Dependency(pomArtifact,scope); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot(dependency); collectRequest.setRepositories(remoteRepos); DependencyNode node = repoSystem.collectDependencies(repoSession,collectRequest).getRoot(); DependencyRequest projectDependencyRequest = new DependencyRequest(node,null); repoSystem.resolveDependencies(repoSession,projectDependencyRequest); PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); node.accept(nlg); ret.addAll(nlg.getDependencies(true)); return ret; }
我知道这可能是一个不寻常的要求,也许我应该只是废弃我正在做的事情,并把它作为一个插件包装…但我只是想完成我现在开始!提前致谢.
解决方法
尝试
@L_404_1@,这是一个包装从
Apache Aether从Sonatype:
final File repo = this.session.getLocalRepository().getBasedir(); final Collection<Artifact> deps = new Aether(this.getProject(),repo).resolve( new DefaultArtifact("junit","junit-dep","","jar","4.10"),JavaScopes.RUNTIME );
如果你是外面的Maven插件:
final File repo = new File(System.getProperty("java.io.tmpdir"),"my-repo"); final MavenProject project = new MavenProject(); project.setRemoteArtifactRepositories( Arrays.asList( new RemoteRepository( "maven-central","default","http://repo1.maven.org/maven2/" ) ) ); final Collection<Artifact> deps = new Aether(project,JavaScopes.RUNTIME );