共用方式為


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