Partilhar via


Resolução de dependências de Java

Observação

Esta funcionalidade está disponível apenas em .NET 9+.

Uma vez que a verificação de dependência Java tenha sido ativada para um projeto de bindings, seja automaticamente via <AndroidMavenLibrary> ou manualmente via <AndroidLibrary>, poderão surgir erros a serem resolvidos, tais como:

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

Estas dependências podem ser cumpridas de muitas formas diferentes.

<PackageReference>

No melhor cenário, já existe uma ligação existente da dependência Java disponível em NuGet.org. Este pacote pode ser fornecido pela Microsoft ou pela comunidade .NET. Pacotes mantidos pela Microsoft podem aparecer na mensagem de erro desta forma:

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.

Adicionar o Xamarin.AndroidX.Collection pacote ao projeto deverá resolver automaticamente este erro, pois o pacote fornece metadados para anunciar que fornece a androidx.collection:collection dependência. Isto faz-se procurando uma etiqueta NuGet especialmente criada. Por exemplo, para a biblioteca AndroidX Collection, a etiqueta é a seguinte:

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

No entanto, podem existir pacotes NuGet que cumprem uma dependência mas não tiveram estes metadados adicionados. Neste caso, terá de especificar explicitamente qual a dependência que o pacote contém com JavaArtifact:

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

Com isto, o processo de ligação sabe que a dependência de Java é satisfeita pelo pacote NuGet.

Observação

Os pacotes NuGet especificam as suas próprias dependências, por isso não terá de se preocupar com dependências transitivas.

<ProjectReference>

Se a dependência Java necessária for fornecida por outro projeto na sua solução, pode anotar o <ProjectReference> para especificar a dependência que cumpre:

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

Com isto, o processo de ligação sabe que a dependência do Java é satisfeita pelo projeto referenciado.

Observação

Cada projeto especifica as suas próprias dependências, por isso não terá de se preocupar com dependências transitivas.

<AndroidLibrary>

Se estiver a criar um pacote público do NuGet, vai querer seguir a política do NuGet de "uma biblioteca por pacote" para que o grafo de dependência do NuGet funcione. No entanto, se estiver a criar uma vinculação para uso privado, pode querer incluir as suas dependências Java diretamente dentro da vinculação pai.

Isto pode ser feito adicionando itens adicionais <AndroidLibrary> ao projeto:

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

Para incluir a biblioteca Java mas sem produzir bindings em C# para ela, marque-a com Bind="false":

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

Alternativamente, <AndroidMavenLibrary> pode ser usado para recuperar uma biblioteca Java de um repositório 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>

Observação

Se a biblioteca de dependências tiver as suas próprias dependências, será necessário garantir que são cumpridas.

<AndroidIgnoredJavaDependency>

Como último recurso, uma dependência necessária do Java pode ser ignorada. Um exemplo de quando isto é útil é se a biblioteca de dependências for uma coleção de anotações Java que são usadas apenas no tipo de compilação e não em tempo de execução.

Note que, embora a mensagem de erro desapareça, isso não significa que o pacote funcione magicamente. Se a dependência for realmente necessária em tempo de execução e não fornecida, a aplicação Android irá crashar com um Java.Lang.NoClassDefFoundError erro.

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

Observação

Qualquer utilização de JavaArtifact pode especificar múltiplos artefactos, delimitando-os com uma vírgula ou um ponto e vírgula.