Condividi tramite


Risoluzione delle dipendenze Java

Nota

Questa funzionalità è disponibile solo in .NET 9+.

Dopo aver abilitato la verifica delle dipendenze Java per un progetto di binding, tramite o manualmente tramite <AndroidMavenLibrary> <AndroidLibrary>, potrebbero verificarsi errori da risolvere, ad esempio:

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

Queste dipendenze possono essere soddisfatte in molti modi diversi.

<PackageReference>

Nello scenario migliore esiste già un'associazione esistente della dipendenza Java in NuGet.org. Questo pacchetto può essere fornito da Microsoft o dalla community .NET. I pacchetti gestiti da Microsoft possono essere visualizzati nel messaggio di errore simile al seguente:

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.

L'aggiunta del Xamarin.AndroidX.Collection pacchetto al progetto dovrebbe risolvere automaticamente questo errore, perché il pacchetto fornisce metadati per annunciare che fornisce la androidx.collection:collection dipendenza. Questa operazione viene eseguita cercando un tag NuGet appositamente creato. Ad esempio, per la libreria Raccolta AndroidX, il tag è simile al seguente:

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

Tuttavia, potrebbero essere presenti pacchetti NuGet che soddisfano una dipendenza, ma non hanno aggiunto questi metadati. In questo caso, sarà necessario specificare in modo esplicito la dipendenza che il pacchetto contiene con JavaArtifact:

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

Con questo, il processo di associazione sa che la dipendenza Java è soddisfatta dal pacchetto NuGet.

Nota

I pacchetti NuGet specificano le proprie dipendenze, quindi non è necessario preoccuparsi delle dipendenze transitive.

<ProjectReference>

Se la dipendenza Java necessaria viene fornita da un altro progetto nella soluzione, è possibile annotare per <ProjectReference> specificare la dipendenza che soddisfa:

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

Con questo, il processo di associazione sa che la dipendenza Java è soddisfatta dal progetto a cui si fa riferimento.

Nota

Ogni progetto specifica le proprie dipendenze, quindi non è necessario preoccuparsi delle dipendenze transitive.

<AndroidLibrary>

Se si crea un pacchetto NuGet pubblico, è necessario seguire i criteri "una libreria per pacchetto" di NuGet in modo che il grafico delle dipendenze NuGet funzioni. Tuttavia, se si crea un'associazione per uso privato, è possibile includere le dipendenze Java direttamente all'interno dell'associazione padre.

A tale scopo, aggiungere elementi aggiuntivi <AndroidLibrary> al progetto:

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

Per includere la libreria Java ma non produrre associazioni C#, contrassegnarla con Bind="false":

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

In alternativa, <AndroidMavenLibrary> è possibile usare per recuperare una libreria Java da un repository 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>

Nota

Se la libreria di dipendenze ha dipendenze proprie, sarà necessario assicurarsi che vengano soddisfatte.

<AndroidIgnoredJavaDependency>

Come ultima risorsa, una dipendenza Java necessaria può essere ignorata. Un esempio di quando questo è utile è se la libreria di dipendenze è una raccolta di annotazioni Java usate solo in fase di compilazione e non in fase di esecuzione.

Si noti che, mentre il messaggio di errore andrà via, non significa che il pacchetto funzionerà magicamente. Se la dipendenza è effettivamente necessaria in fase di esecuzione e non viene fornita l'applicazione Android si arresta in modo anomalo con un Java.Lang.NoClassDefFoundError errore.

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

Nota

Qualsiasi utilizzo di JavaArtifact può specificare più artefatti delimitandoli con una virgola o un punto e virgola.