Mavenプラグインの外では、これをプログラムでAetherを使用して行うことができます。
直接の依存関係や潜在的な再配置のようなアーティファクトに関する情報を取得します。
まず、あなたのPOMにオードの依存関係を追加します。
<dependencies>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-impl</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-basic</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-file</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-http</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
<properties>
<aetherVersion>1.1.0</aetherVersion>
<mavenVersion>3.3.9</mavenVersion>
</properties>
は、次に、あなたが持つことができます。これはオードリポジトリシステムを作成し、読むためにそれを言っている何
public static void main(final String[] args) throws Exception {
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
RepositorySystem system = newRepositorySystem(locator);
RepositorySystemSession session = newSession(system);
RemoteRepository central = new RemoteRepository.Builder("central", "default", "http://repo1.maven.org/maven2/").build();
Artifact artifact = new DefaultArtifact("groupId:artifactId:version");
ArtifactDescriptorRequest request = new ArtifactDescriptorRequest(artifact, Arrays.asList(central), null);
ArtifactDescriptorResult result = system.readArtifactDescriptor(session, request);
for (Dependency dependency : result.getDependencies()) {
System.out.println(dependency);
}
}
private static RepositorySystem newRepositorySystem(DefaultServiceLocator locator) {
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
return locator.getService(RepositorySystem.class);
}
private static RepositorySystemSession newSession(RepositorySystem system) {
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository("target/local-repo");
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
// set possible proxies and mirrors
session.setProxySelector(new DefaultProxySelector().add(new Proxy(Proxy.TYPE_HTTP, "host", 3625), Arrays.asList("localhost", "127.0.0.1")));
session.setMirrorSelector(new DefaultMirrorSelector().add("my-mirror", "http://mirror", "default", false, "external:*", null));
return session;
}
を与えられたアーティファクトのアーティファクト記述子。アーティファクトはコンストラクタnew DefaultArtifact("...")
で構築され、必要な座標が与えられます。
要求オブジェクトは、このアーティファクトとそれをフェッチするリポジトリのリストで作成されます。上記のサンプルでは、Maven Centralのみが追加されましたが、RemoteRepository.Builder
クラスを使用して追加することで、RemoteRepository
を追加できます。 readArtifactDescriptor
を呼び出した後、結果には直接依存関係のリストが含まれます。これはgetDependencies()
で取得できます。
プロキシーとミラーは、それぞれDefaultProxySelector
とDefaultMirrorSelector
の助けを借りて構成することができます。 DefaultProxySelector.add
は、Proxy
を引数として取ります。これは、コンストラクタでその型("http"
など)、host、port、およびオプションでAuthentication
(認証オブジェクトを作成する場合はAuthenticationBuilder
クラスを参照してください)のリストと、 -proxiedホスト。同様に、DefaultMirrorSelector.add
は、そのID、URL、タイプ(Mavenの場合は"default"
ですが、例えばP2を持つことができます)、リポジトリマネージャ、実際のリポジトリID(mirror specificationによる)、リポジトリ・タイプはミラーリングされません。
直接の依存関係のみが必要な理由を説明できますか?ここで何を達成しようとしていますか? – user2189998
推移的な依存関係をスキップするように設定されたuber jarについてはどうですか? –
@ user2189998これは実際には複雑です - 私はMavenの中央ジャーの振る舞いを模倣するいくつかのアーティファクトのためのポムを構築する必要があります。これは奇妙に思えますが(実際はそうですが)、長い議論の末、これがレガシープロジェクトの問題を避ける唯一の方法だと思われます。 –