我发现了一些有关工件检索问题的文章,但是答案似乎不适用于我的具体情况。
我正在编写一个插件,该插件将有助于生成瘦身的战争EAR,并且正在运行为EAR maven模块编写的插件。在插件代码中,我已经达到了我想要获得WAR依赖项的依赖项/工件的阶段-当前,这些问题并没有通过我尝试过的任何解决。我认为这是因为即使在我的EAR模块上运行dependency:tree也没有包含它们,它们也不是“传递”依赖关系。
// Neither of the two below return WAR transitive dependencies, just the WARs
project.getDependencies()
project.getArtifacts()
我目前的新方法是:
ArtifactRepository localRepository = project.getDistributionManagementArtifactRepository();
List remoteRepositories = project.getRemoteArtifactRepositories();
ResolutionGroup resolutionGroup = artifactMetadataSource.retrieve(warArtifact, localRepository, remoteRepositories);
Set<Artifact> artifactDependencies = resolutionGroup.getArtifacts();
(注意,这是利用项目的ArtifactMetadataSource
组件对象和依赖项maven-dependency-plugin:2.4
)
这是行不通的。该artifactDependencies
集合为空。现在这必须成为可能,因为mvn dependency:tree
在模块的目录中运行可以正常运行warArtifact
。
有任何想法吗?
我终于有了答案。诚然,它不能正确回答我的原始问题,但这就是我所追求的。
原因是它不能完全回答我的原始帖子:它需要Maven 3。
无论如何,这里是有兴趣的人:
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.CollectRequest;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.DependencyRequest;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.graph.PreorderNodeListGenerator;
import java.util.ArrayList;
import java.util.List;
/**
*
* @goal findShareables
* @phase process-resources
*/
@SuppressWarnings("unchecked")
public class ShareableJarsInWarsExtractor extends AbstractMojo
{
// ...
/**
* The MavenProject object.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
/**
* The entry point to Aether, i.e. the component doing all the work.
*
* @component
*/
private RepositorySystem repoSystem;
/**
* The current repository/network configuration of Maven.
*
* @parameter default-value="${repositorySystemSession}"
* @readonly
*/
private RepositorySystemSession repoSession;
/**
* The project's remote repositories to use for the resolution of plugins and their dependencies.
*
* @parameter default-value="${project.remotePluginRepositories}"
* @readonly
*/
private List<RemoteRepository> remoteRepos;
public void execute() throws MojoExecutionException
{
Artifact projectArtifact = getProjectArtifact();
List<Dependency> projectDependencies = getArtifactsDependencies(projectArtifact);
for (Dependency d : projectDependencies)
{
if (d.getArtifact() != null && "war".equals(d.getArtifact().getExtension()))
{
List<Dependency> warDependencies = getArtifactsDependencies(d.getArtifact());
// I now have all of the WAR's dependencies!! Hooray!
// ...
}
}
// ...
}
private List<Dependency> getArtifactsDependencies(Artifact a)
{
List<Dependency> ret = new ArrayList<Dependency>();
// Note: I get the POM artifact, not the WAR or whatever.
DefaultArtifact pomArtifact = new DefaultArtifact(a.getGroupId(), a.getArtifactId(), "pom", a.getVersion());
CollectRequest collectRequest = new CollectRequest();
collectRequest.setRoot(new Dependency(pomArtifact, "compile"));
collectRequest.setRepositories(remoteRepos);
try
{
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));
}
catch (Exception e)
{
e.printStackTrace();
}
return ret;
}
private Artifact getProjectArtifact()
{
// Todo: There must be a better way!
return new DefaultArtifact(project.getArtifact().toString());
}
// ...
}
我的POM定义了以下依赖关系:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.0.4</version>
</dependency>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句