Compartilhar via


Vinculando uma biblioteca Java a partir do Maven

Um cenário de vinculação comum é vincular uma biblioteca Java hospedada em um repositório Maven (como o Maven Central).

O .NET 9 introduz suporte para baixar automaticamente uma biblioteca Java de um repositório Maven e verificar suas dependências para ajudar a tornar esse cenário mais fácil e preciso.

Dica

Se estiver usando uma versão do .NET anterior ao .NET 9 ou associando uma biblioteca Java que não seja do Maven, consulte a documentação Associando uma biblioteca Java.

Passo a passo

Neste passo a passo, vamos associar a versão 3.1.0 de CircleImageView, uma biblioteca que exibe uma imagem em uma tela circular.

No repositório Maven, podemos ver os seguintes identificadores para esta biblioteca que serão necessários posteriormente:

<dependency>
    <groupId>de.hdodenhof</groupId>
    <artifactId>circleimageview</artifactId>
    <version>3.1.0</version>
</dependency>

Criando a biblioteca de vinculações

Primeiro, crie um novo projeto de Biblioteca de Bindings. Isso pode ser feito com o modelo de projeto "Android Java Binding Library" disponível no Visual Studio ou por meio da linha de dotnet comando com:

dotnet new android-bindinglib

Abra o arquivo de projeto (.csproj) criado pelo modelo. Adicionaremos um AndroidMavenLibrary elemento dentro de um ItemGroup para especificar a biblioteca Java que queremos vincular:

<!-- Include format is {GroupId}:{ArtifactId} -->
<ItemGroup>
  <AndroidMavenLibrary Include="de.hdodenhof:circleimageview" Version="3.1.0" />
</ItemGroup>

Agora compile o projeto usando o comando Build do Visual Studio ou na linha de comando:

dotnet build

Esta biblioteca Java foi vinculada e agora está pronta para ser referenciada por um projeto .NET para aplicativo Android ou publicada no NuGet para uso público.

Opções adicionais

Ignorar associações gerenciadas

Por padrão, as vinculações C# serão criadas para qualquer .JAR/.AAR colocado no projeto. No entanto, as associações C# podem ser difíceis de criar e não são necessárias se você não pretende chamar a API Java do C#.

Esse é especialmente o caso quando a biblioteca Java é simplesmente uma dependência de outra biblioteca Java e não precisa ser chamada diretamente do C#. Nesse caso, o Bind="false" atributo pode ser usado apenas para incluir a dependência Java, mas não para vinculá-la.

<ItemGroup>
  <AndroidMavenLibrary Include="de.hdodenhof:circleimageview" Version="3.1.0" Bind="false" />
</ItemGroup>

Próximas etapas

  • AndroidMavenLibrary Opções - A biblioteca passo a passo foi baixada automaticamente do Maven Central, que é o repositório padrão. Outros repositórios e opções do Maven podem ser especificados.

  • Verificação de Dependência Java - A biblioteca Java vinculada no tutorial é trivial e não dependia de nenhum outro pacote Java. A maioria das bibliotecas dependerá de outros pacotes Java e erros serão exibidos para garantir que essas dependências possam ser resolvidas.

Esses erros devem ser corrigidos antes que a associação possa ser compilada e se parecem com:

error XA4241: Java dependency 'androidx.collection:collection:1.0.0' is not satisfied.
error XA4242: Java dependency 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0' is not satisfied. Microsoft maintains the NuGet package 'Xamarin.Kotlin.StdLib' that could fulfill this dependency.
  • Personalizando associações com metadados – a biblioteca Java associada no passo a passo é trivial e as ferramentas de associação foram capazes de convertê-la automaticamente em uma API C#. Infelizmente, muitas vezes não é esse o caso e muitas vezes haverá erros de compilação. Esses erros devem ser corrigidos com "metadados" para instruir manualmente as ferramentas de associação sobre como resolver as diferenças entre as linguagens Java e C#.

  • Alterando namespaces - Os tipos no passo a passo terminam no namespace DE.Hdodenhof.Circleimageview do .NET. Os nomes de pacotes Java tendem a ser mais detalhados do que os namespaces .NET e pode ser mais desejável alterá-lo, por exemplo, para CircleImageViewLibrary usando um AndroidNamespaceReplacement:

<ItemGroup>
  <AndroidNamespaceReplacement Include='DE.Hdodenhof.Circleimageview' Replacement='CircleImageViewLibrary' />
</ItemGroup>