Lösa Java-beroenden

Anmärkning

Den här funktionen är endast tillgänglig i .NET 9+.

När Java-beroendeverifiering har aktiverats för ett bindningsprojekt, antingen automatiskt via <AndroidMavenLibrary> eller manuellt via <AndroidLibrary>, kan det finnas fel att lösa, till exempel:

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

Dessa beroenden kan uppfyllas på många olika sätt.

<PackageReference>

I bästa fall finns det redan en befintlig bindning av Java-beroendet som är tillgängligt för NuGet.org. Det här paketet kan tillhandahållas av Microsoft eller .NET-communityn. Paket som underhålls av Microsoft kan visas i felmeddelandet så här:

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.

Att lägga till Xamarin.AndroidX.Collection-paketet i projektet bör automatiskt lösa det här felet, eftersom paketet tillhandahåller metadata för att ange att det tillhandahåller androidx.collection:collection-beroendet. Detta görs genom att leta efter en specialgjord NuGet-tagg. För AndroidX-samlingsbiblioteket ser taggen till exempel ut så här:

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

Det kan dock finnas NuGet-paket som uppfyller ett beroende men som inte har lagt till dessa metadata. I det här fallet måste du uttryckligen ange vilket beroende paketet innehåller med JavaArtifact:

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

Med detta vet bindningsprocessen att Java-beroendet är uppfyllt av NuGet-paketet.

Anmärkning

NuGet-paket anger sina egna beroenden, så du behöver inte bekymra dig om transitiva beroenden.

<ProjectReference>

Om det nödvändiga Java-beroendet tillhandahålls av ett annat projekt i din lösning kan du kommentera <ProjectReference> för att ange det beroende som det uppfyller:

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

Med detta vet bindningsprocessen att Java-beroendet uppfylls av det refererade projektet.

Anmärkning

Varje projekt anger sina egna beroenden, så du behöver inte bekymra dig om transitiva beroenden.

<AndroidLibrary>

Om du skapar ett offentligt NuGet-paket vill du följa NuGets princip "ett bibliotek per paket" så att NuGet-beroendediagrammet fungerar. Men om du skapar en bindning för privat användning kanske du vill inkludera dina Java-beroenden direkt i den överordnade bindningen.

Detta kan göras genom att lägga till ytterligare <AndroidLibrary> objekt i projektet:

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

Om du vill inkludera Java-biblioteket men inte skapa C#-bindningar för det markerar du det med Bind="false":

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

Du kan också <AndroidMavenLibrary> använda för att hämta ett Java-bibliotek från en Maven-lagringsplats:

<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>

Anmärkning

Om beroendebiblioteket har sina egna beroenden behöver du se till att de uppfylls.

<AndroidIgnoredJavaDependency>

Som en sista utväg kan ett Java-beroende som behövs ignoreras. Ett exempel på när detta är användbart är om beroendebiblioteket är en samling Java-anteckningar som endast används vid kompileringstyp och inte körning.

Observera att även om felmeddelandet försvinner betyder det inte att paketet kommer att fungera magiskt. Om beroendet faktiskt behövs vid körtid och inte tillhandahålls, kommer Android-applikationen att krascha med ett Java.Lang.NoClassDefFoundError fel.

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

Anmärkning

All användning av JavaArtifact kan ange flera artefakter genom att avgränsa dem med kommatecken eller semikolon.