通过


解析 Java 依赖项

注意

此功能仅在 .NET 9+ 中可用。

一旦为绑定项目启用了 Java 依赖项验证,无论是通过 <AndroidMavenLibrary> 自动启用,还是通过 <AndroidLibrary> 手动启用,都可能会出现错误需要解决,例如:

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

可以通过许多不同的方式实现这些依赖项。

<PackageReference>

在最佳情况下,NuGet.org 上已有 Java 依赖项的现有绑定。此包可由Microsoft或 .NET 社区提供。 Microsoft维护的包可能会显示在错误消息中,如下所示:

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.

Xamarin.AndroidX.Collection 包添加到项目中后,应该会自动解决这个错误,因为该包提供的元数据显示它提供 androidx.collection:collection 依赖项。 这是通过查找专门设计的 NuGet 标记来完成的。 例如,对于 AndroidX 集合库,标记如下所示:

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

但是,可能有 NuGet 包满足依赖项,但尚未向其添加此元数据。 在这种情况下,您需要显式地指定包中包含哪种依赖关系 JavaArtifact:

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

因此,绑定进程知道 NuGet 包满足 Java 依赖项。

注意

NuGet 包定义自己的依赖项,所以无需担心可传递依赖项。

<ProjectReference>

如果解决方案中的另一个项目提供了所需的 Java 依赖项,可以批注 <ProjectReference> 指定它满足的依赖项:

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

因此,绑定进程知道引用的项目满足 Java 依赖项。

注意

每个项目都指定其自己的依赖项,因此无需担心可传递依赖项。

<AndroidLibrary>

如果要创建公共 NuGet 包,则需要遵循 NuGet 的“每个包一个库”策略,以便 NuGet 依赖项关系图正常工作。 但是,如果创建用于专用的绑定,可能需要将 Java 依赖项直接包含在父绑定中。

可以通过向项目添加其他 <AndroidLibrary> 项来完成此操作:

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

若要包含 Java 库,但不为其生成 C# 绑定,请使用 Bind="false"

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

或者, <AndroidMavenLibrary> 可用于从 Maven 存储库检索 Java 库:

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

注意

如果依赖项库具有自己的依赖项,则需要确保它们得到满足。

<AndroidIgnoredJavaDependency>

作为最后手段,可以忽略所需的 Java 依赖项。 如果依赖项库是仅在编译类型而非运行时使用的 Java 批注的集合,则此示例非常有用。

请注意,虽然错误消息会消失,但这并不意味着软件包会自动开始工作。 如果在运行时实际需要依赖项,但未提供 Android 应用程序将崩溃并出现 Java.Lang.NoClassDefFoundError 错误。

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

注意

任何用法 JavaArtifact 都可以通过用逗号或分号分隔项目来指定多个项目。