我正在创建一个Maven插件,它具有相当独特的正确操作要求:它需要生成自己的新进程,然后等待这些进程完成任务。
虽然这在命令行上相对简单,但Maven插件不会像传统Java代码那样被调用,因此没有类路径。我无法弄清楚如何在插件中解析正确的类路径,这样我就可以生成一个新的JVM(在插件中调用另一个类的Main方法)。
使用当前工件MavenProject
我能够获得Artifact
对自己(插件)的引用,并在本地Maven存储库中获取它的相对目录:
Artifact self = null;
for (Artifact artifact : project.getPluginArtifacts()) {
if ("my-group-id".equals(artifact.getGroupId()) && "my-artifact-id".equals(artifact.getArtifactId())) {
self = artifact;
break;
}
}
if (self == null) {
throw new MojoExecutionException("Could not find representation of this plugin in project.");
}
for (ArtifactRepository artifactRepository : project.getPluginArtifactRepositories()) {
String path = artifactRepository.pathOf(self);
if (path != null) {
getLog().info("relative path to self: " + path);
break;
}
}
如何获取对其所有依赖项(和传递依赖项)的引用,以便我可以为新调用构造完整的类路径?我看到self
有一个依赖过滤器,但我不知道在哪里应用它。
这是在插件中创建“我自己”的新流程的正确方法吗?还有更好的方法吗?
答案 0 :(得分:3)
我发现了a great article关于Maven 2和Maven 3的依赖解析之间的差异。
鉴于Artifact
,归结为以下内容:
private Set<Artifact> getDependenciesForArtifact(Artifact artifact) {
ArtifactResolutionRequest arr = new ArtifactResolutionRequest()
.setArtifact(artifact)
.setResolveTransitively(true)
.setLocalRepository(local);
return repositorySystem.resolve(arr).getArtifacts();
}
使用Set
,您可以在pathOf
上为每个元素调用ArtifactRepository
并加入File.pathSeparator
。
答案 1 :(得分:1)
嗯。不是一个答案,而是一些提示。你为什么需要这么复杂的东西?此外,我将深入研究maven-surefire-plugin,它可以为单元测试分叉jvm并且可以处理类路径。另一方面,您可以查看maven-invoker或maven-invoker-plugin中可以完全分叉maven的内容。啊......我错过了什么。查看具有创建类路径的特定目标的maven-dependency-plugin,您可以在其中查看它们构造类路径的来源。