Java-függőségek feloldása

Megjegyzés:

Ez a funkció csak a .NET 9+-ban érhető el.

A Java-függőségek ellenőrzése engedélyezve lett egy kötésprojekt esetében, akár automatikusan a <AndroidMavenLibrary> segítségével, akár manuálisan a <AndroidLibrary> használatával, előfordulhatnak hibák, például:

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

Ezek a függőségek sokféleképpen teljesíthetők.

<PackageReference>

A legjobb esetben már elérhető a Java-függőség egy meglévő kötése a NuGet.org. Ezt a csomagot a Microsoft vagy a .NET-közösség nyújthatja. A Microsoft által karbantartott csomagok a következőhöz hasonló hibaüzenetben jelenhetnek meg:

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.

Ha hozzáadja a Xamarin.AndroidX.Collection csomagot a projekthez, automatikusan meg kell oldania ezt a hibát, mivel a csomag metaadatokat biztosít annak meghirdetéséhez, hogy az biztosítja a androidx.collection:collection függőséget. Ehhez egy speciálisan kialakított NuGet-címkét kell keresnie. Az AndroidX-gyűjtemény kódtára esetében például a címke a következőképpen néz ki:

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

Lehetnek azonban olyan NuGet-csomagok, amelyek megfelelnek a függőségnek, de nem adhatók hozzá ezek a metaadatok. Ebben az esetben explicit módon meg kell adnia, hogy a csomag melyik függőséget JavaArtifacttartalmazza:

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

Ezzel a kötési folyamat tudja, hogy a NuGet-csomag kielégíti a Java-függőséget.

Megjegyzés:

A NuGet-csomagok saját függőségeket határoznak meg, így nem kell aggódnia a tranzitív függőségek miatt.

<ProjectReference>

Ha a szükséges Java-függőséget egy másik projekt biztosítja a megoldásban, megjegyzésekkel <ProjectReference> adhatja meg, hogy milyen függőségnek felel meg:

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

Ezzel a kötési folyamat tudja, hogy a Java-függőséget a hivatkozott projekt kielégíti.

Megjegyzés:

Minden projekt saját függőségeket határoz meg, ezért nem kell aggódnia az átvitt függőségek miatt.

<AndroidLibrary>

Nyilvános NuGet-csomag létrehozásakor a NuGet "csomagonként egy kódtár" szabályzatát kell követnie, hogy a NuGet függőségi gráf működjön. Ha azonban privát használatra hoz létre kötést, érdemes lehet közvetlenül a szülőkötésbe belefoglalni a Java-függőségeket.

Ezt úgy teheti meg, hogy további <AndroidLibrary> elemeket ad hozzá a projekthez:

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

Ha hozzá szeretné adni a Java-kódtárat, de nem szeretne C#-kötéseket létrehozni, jelölje meg a következővel Bind="false":

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

<AndroidMavenLibrary> Másik lehetőségként java-kódtárat is lekérhet egy Maven-adattárból:

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

Megjegyzés:

Ha a függőségi könyvtárnak saját függőségei vannak, biztosítania kell, hogy azok teljesüljenek.

<AndroidIgnoredJavaDependency>

Végső megoldásként egy szükséges Java-függőség figyelmen kívül hagyható. Ilyen például, ha a függőségi kódtár Java-széljegyzetek gyűjteménye, amelyeket csak fordítási típusban, nem futtatókörnyezetben használnak.

Vegye figyelembe, hogy bár a hibaüzenet eltűnik, nem jelenti azt, hogy a csomag varázslatosan működik. Ha a futási időben valóban szükség van a függőségre, és az nem kerül biztosításra, az Android-alkalmazás Java.Lang.NoClassDefFoundError hibával összeomlik.

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

Megjegyzés:

JavaArtifact használatával több összetevőt is megadhatunk, amelyeket vesszővel vagy pontosvesszővel választunk el.