注意
此功能仅在 .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 都可以通过用逗号或分号分隔项目来指定多个项目。