Delen via


Java-afhankelijkheden oplossen

Opmerking

Deze functie is alleen beschikbaar in .NET 9+.

Zodra verificatie van Java-afhankelijkheden is ingeschakeld voor een bindingsproject, automatisch via <AndroidMavenLibrary> of handmatig via <AndroidLibrary>, kunnen er fouten optreden die kunnen worden opgelost, zoals:

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

Deze afhankelijkheden kunnen op veel verschillende manieren worden vervuld.

<PackageReference>

In het beste geval is er al een bestaande binding van de Java-afhankelijkheid die beschikbaar is voor NuGet.org. Dit pakket kan worden geleverd door Microsoft of de .NET-community. Pakketten die door Microsoft worden onderhouden, kunnen als volgt worden weergegeven in het foutbericht:

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.

Als u het Xamarin.AndroidX.Collection pakket aan het project toevoegt, wordt deze fout automatisch opgelost, omdat het pakket metagegevens bevat om te adverteren dat het de androidx.collection:collection afhankelijkheid biedt. Dit wordt gedaan door te zoeken naar een speciaal ontworpen NuGet-tag. Voor de AndroidX-collection-bibliotheek ziet de tag er als volgt uit:

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

Er kunnen echter NuGet-pakketten zijn die voldoen aan een afhankelijkheid, maar waaraan deze metagegevens niet zijn toegevoegd. In dit geval moet u expliciet opgeven welke afhankelijkheid het pakket bevat met JavaArtifact:

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

Hiermee weet het bindingsproces dat de Java-afhankelijkheid wordt voldaan door het NuGet-pakket.

Opmerking

NuGet-pakketten geven hun eigen afhankelijkheden op, dus u hoeft zich geen zorgen te maken over transitieve afhankelijkheden.

<ProjectReference>

Als de benodigde Java-afhankelijkheid wordt geleverd door een ander project in uw oplossing, kunt u het <ProjectReference> annoteren om te specificeren welke afhankelijkheid het vervult.

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

Hiermee weet het bindingsproces dat aan de Java-afhankelijkheid wordt voldaan door het project waarnaar wordt verwezen.

Opmerking

Elk project specificeert hun eigen afhankelijkheden, dus u hoeft zich geen zorgen te maken over transitieve afhankelijkheden.

<AndroidLibrary>

Als u een openbaar NuGet-pakket maakt, moet u het beleid 'één bibliotheek per pakket' van NuGet volgen, zodat de NuGet-afhankelijkheidsgrafiek werkt. Als u echter een binding maakt voor privégebruik, kunt u uw Java-afhankelijkheden rechtstreeks in de bovenliggende binding opnemen.

U kunt dit doen door extra <AndroidLibrary> items toe te voegen aan het project:

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

Als u de Java-bibliotheek wilt opnemen, maar er geen C#-bindingen voor wilt maken, markeert u deze met Bind="false":

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

U kunt ook <AndroidMavenLibrary> een Java-bibliotheek ophalen uit een Maven-opslagplaats:

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

Opmerking

Als de afhankelijkheidsbibliotheek eigen afhankelijkheden heeft, moet u ervoor zorgen dat deze worden uitgevoerd.

<AndroidIgnoredJavaDependency>

Als laatste redmiddel kan een benodigde Java-afhankelijkheid worden genegeerd. Een voorbeeld van wanneer dit handig is, is als de afhankelijkheidsbibliotheek een verzameling Java-aantekeningen is die alleen worden gebruikt bij het compilertype en niet bij runtime.

Houd er rekening mee dat hoewel het foutbericht verdwijnt, het niet betekent dat het pakket magisch werkt. Als de afhankelijkheid daadwerkelijk nodig is tijdens runtime en niet is opgegeven, loopt de Android-toepassing vast met een Java.Lang.NoClassDefFoundError fout.

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

Opmerking

Het gebruik van JavaArtifact kan meerdere artefacten specificeren door ze te scheiden met een komma of puntkomma.