次の方法で共有


Java の依存関係の解決

この機能は、.NET 9 以降でのみ使用できます。

バインディング プロジェクトに対して Java 依存関係の検証が有効化されると、<AndroidMavenLibrary>を通じて自動的に、または<AndroidLibrary>を通じて手動で実行される場合、例えば次のようなエラーが発生する可能性があります。

error : Java dependency 'androidx.collection:collection' version '1.0.0' is not satisfied.

これらの依存関係は、さまざまな方法で満たすことができます。

<PackageReference>

最適なシナリオでは、NuGet.org で使用可能な Java 依存関係の既存のバインディングが既に存在します。このパッケージは、Microsoft または .NET コミュニティによって提供される場合があります。 Microsoft によって管理されているパッケージは、次のようなエラー メッセージに表示される場合があります。

error : Java dependency 'androidx.collection:collection' version '1.0.0' is not satisfied. Microsoft maintains the NuGet package 'Xamarin.AndroidX.Collection' that could fulfill this dependency.

Xamarin.AndroidX.Collection パッケージをプロジェクトに追加すると、androidx.collection:collection依存関係を提供するメタデータがパッケージによって提供されるため、このエラーは自動的に解決されます。 これは、特別に細工された NuGet タグを探すことによって行われます。 たとえば、AndroidX コレクション ライブラリの場合、タグは次のようになります。

<!-- artifact={GroupId}:{ArtifactId}:{Java Library Version} -->
<PackageTags>artifact=androidx.collection:collection:1.0.0</PackageTags>

ただし、依存関係を満たすが、このメタデータを追加していない NuGet パッケージがある可能性があります。 この場合は、パッケージに含まれる依存関係を JavaArtifactで明示的に指定する必要があります。

<PackageReference 
  Include="Xamarin.Kotlin.StdLib" 
  Version="1.7.10" 
  JavaArtifact="org.jetbrains.kotlin:kotlin-stdlib:1.7.10" />

これにより、バインド プロセスは、Java の依存関係が NuGet パッケージによって満たされていることを認識します。

NuGet パッケージは独自の依存関係を指定するため、推移的な依存関係について心配する必要はありません。

<ProjectReference>

必要な Java 依存関係がソリューション内の別のプロジェクトによって提供される場合は、 <ProjectReference> に注釈を付けて、それが満たす依存関係を指定できます。

<ProjectReference 
  Include="..\My.Other.Binding\My.Other.Binding.csproj" 
  JavaArtifact="my.other.binding:helperlib:1.0.0" />

これにより、バインド プロセスは、参照されるプロジェクトによって Java の依存関係が満たされていることを認識します。

各プロジェクトは独自の依存関係を指定するため、推移的な依存関係について心配する必要はありません。

<AndroidLibrary>

パブリック NuGet パッケージを作成する場合は、NuGet の "パッケージごとに 1 つのライブラリ" ポリシーに従って、NuGet 依存関係グラフが機能するようにします。 ただし、プライベート用のバインドを作成する場合は、Java の依存関係を親バインド内に直接含めることができます。

これを行うには、プロジェクトに <AndroidLibrary> 項目を追加します。

<ItemGroup>
  <AndroidLibrary Include="mydependency.jar" JavaArtifact="my.library:dependency-library:1.0.0" />
</ItemGroup>

Java ライブラリを含め、C# バインドを生成しない場合は、 Bind="false"でマークします。

<ItemGroup>
  <AndroidLibrary Include="mydependency.jar" JavaArtifact="my.library:dependency-library:1.0.0" Bind="false" />
</ItemGroup>

または、 <AndroidMavenLibrary> を使用して、Maven リポジトリから Java ライブラリを取得することもできます。

<ItemGroup>
  <AndroidMavenLibrary Include="my.library:dependency-library" Version="1.0.0" />
  <!-- or, if the Java library doesn't need to be bound -->
  <AndroidMavenLibrary Include="my.library:dependency-library" Version="1.0.0" Bind="false" />
</ItemGroup>

依存関係ライブラリに独自の依存関係がある場合は、それらが満たされていることを確認する必要があります。

<AndroidIgnoredJavaDependency>

最後の手段として、必要な Java 依存関係は無視できます。 これが役立つ例は、依存関係ライブラリが、コンパイル型でのみ使用され、実行時には使用されない Java 注釈のコレクションである場合です。

エラー メッセージが消える一方で、パッケージが魔法のように動作することを意味するわけではないことに注意してください。 依存関係が実際に実行時に必要であり、指定されていない場合、Android アプリケーションは Java.Lang.NoClassDefFoundError エラーでクラッシュします。

<ItemGroup>
  <AndroidIgnoredJavaDependency Include="com.google.errorprone:error_prone_annotations:2.15.0" />
</ItemGroup>

JavaArtifactを使用すると、複数の成果物をコンマまたはセミコロンで区切って指定できます。