解析 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
都可以使用逗號或分號來分隔多個成品。