Разрешение зависимостей Java

Примечание.

Эта функция доступна только в .NET 9+.

После включения проверки зависимостей Java для проекта привязок автоматически через <AndroidMavenLibrary> или вручную через <AndroidLibrary>, могут возникнуть ошибки, например:

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

Эти зависимости могут выполняться различными способами.

<PackageReference>

В лучшем случае уже существует привязка зависимости Java к NuGet.org. Этот пакет может предоставляться корпорацией Майкрософт или сообществом .NET. Пакеты, поддерживаемые корпорацией Майкрософт, могут отображаться в сообщении об ошибке следующим образом:

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 "одна библиотека на пакет", чтобы 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> можно использовать для получения библиотеки Java из репозитория Maven:

<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 может указать несколько артефактов, разделив их запятой или точкой с запятой.