7

適切な操作のためのかなりユニークな要件を持つ 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ますが、どこに適用すればよいかわかりません。

これは、プラグイン内に「自分」の新しいプロセスを作成する適切な方法ですか? より良い方法はありますか?

4

2 に答える 2

3

Maven2とMaven3の依存関係の解決の違いに関するすばらしい記事を見つけました。

与えられたArtifactそれは次のように要約されます:

private Set<Artifact> getDependenciesForArtifact(Artifact artifact) {
  ArtifactResolutionRequest arr = new ArtifactResolutionRequest()
      .setArtifact(artifact)
      .setResolveTransitively(true)
      .setLocalRepository(local);
  return repositorySystem.resolve(arr).getArtifacts();
}

を使用すると、各要素に対してを呼び出し、 。と結合することでSetを構築できます。pathOfArtifactRepositoryFile.pathSeparator

于 2012-12-29T06:01:57.777 に答える
1

うーん。実際には答えではありませんが、いくつかのヒントがあります。なぜこんなに複雑なものが必要なのですか?さらに、単体テスト用にjvmをフォークでき、クラスパスを処理できるmaven-surefire-pluginを詳しく調べます。一方、Maven-invokerまたはMavenを完全にフォークできるmaven-invoker-pluginを調べることができます。ああ..私が逃したもの。クラスパスを作成するための特定の目標を持つmaven-dependency-pluginを調べてください。ここで、ソースがクラスパスを構築する方法を調べることができます。

于 2012-12-26T10:15:34.893 に答える