Compartilhar via


Resolvendo dependências do Java

Observação

Esse recurso só está disponível no .NET 9+.

Depois que a verificação de dependência Java tiver sido habilitada para um projeto de vinculações, automaticamente ou manualmente por meio <AndroidMavenLibrary> <AndroidLibrary>do , pode haver erros a serem resolvidos, como:

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

Essas dependências podem ser atendidas de muitas maneiras diferentes.

<PackageReference>

Na melhor das hipóteses, já existe uma ligação existente da dependência Java disponível no NuGet.org. Este pacote pode ser fornecido pela Microsoft ou pela comunidade .NET. Os pacotes mantidos pela Microsoft podem ser exibidos na mensagem de erro como esta:

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 deve resolver automaticamente esse erro, pois o pacote fornece metadados para anunciar que fornece a androidx.collection:collection dependência. Isso é feito procurando uma marca NuGet especialmente criada. Por exemplo, para a biblioteca AndroidX Collection, a tag tem esta aparência:

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

No entanto, pode haver pacotes NuGet que atendem a uma dependência, mas não tiveram esses metadados adicionados a ele. Nesse caso, você precisará especificar explicitamente qual dependência 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 isso, o processo de associação sabe que a dependência Java é satisfeita pelo pacote NuGet.

Observação

Os pacotes NuGet especificam suas próprias dependências, portanto, você não precisará se preocupar com dependências transitivas.

<ProjectReference>

Se a dependência Java necessária for fornecida por outro projeto em sua solução, você poderá anotar o <ProjectReference> para especificar a dependência que ela atende:

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

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

Observação

Cada projeto especifica suas próprias dependências, portanto, você não precisará se preocupar com dependências transitivas.

<AndroidLibrary>

Se você estiver criando um pacote NuGet público, convém seguir a política de "uma biblioteca por pacote" do NuGet para que o grafo de dependência do NuGet funcione. No entanto, se estiver criando uma ligação para uso privado, talvez você queira incluir suas dependências Java diretamente dentro da ligação pai.

Isso 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 não produzir associações C# para ela, marque-a com Bind="false":

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

Como alternativa, <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 suas próprias dependências, você será solicitado a garantir que elas sejam atendidas.

<AndroidIgnoredJavaDependency>

Como último recurso, uma dependência Java necessária pode ser ignorada. Um exemplo de quando isso é ú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 no tempo de execução.

Observe que, embora a mensagem de erro desapareça, isso não significa que o pacote funcionará magicamente. Se a dependência for realmente necessária no tempo de execução e não for fornecida, o aplicativo Android falhará com um Java.Lang.NoClassDefFoundError erro.

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

Observação

Qualquer uso de JavaArtifact pode especificar vários artefatos delimitando-os com uma vírgula ou ponto e vírgula.