다음을 통해 공유


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 패키지가 있을 수 있습니다. 이 경우 패키지에 포함되는 종속성 및 JavaVersion다음을 명시적으로 지정해야 합니다.JavaArtifact

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

이를 통해 바인딩 프로세스는 Java 종속성이 NuGet 패키지에 의해 충족됨을 알고 있습니다.

참고: NuGet 패키지는 자체 종속성을 지정하므로 전이적 종속성에 대해 걱정할 필요가 없습니다.

<ProjectReference>

솔루션의 다른 프로젝트에서 필요한 Java 종속성을 제공하는 경우 해당 종속성을 지정하도록 주석 <ProjectReference> 을 달 수 있습니다.

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

이를 통해 바인딩 프로세스는 Java 종속성이 참조된 프로젝트에서 충족되는 것을 알고 있습니다.

참고: 각 프로젝트는 자체 종속성을 지정하므로 전이적 종속성에 대해 걱정할 필요가 없습니다.

<AndroidLibrary>

공용 NuGet 패키지를 만드는 경우 NuGet이 작동하도록 NuGet의 "패키지당 하나의 라이브러리" 정책을 따라야 종속성 그래프. 그러나 프라이빗 사용을 위한 바인딩을 만드는 경우 Java 종속성을 부모 바인딩 내에 직접 포함할 수 있습니다.

이 작업은 프로젝트에 추가 <AndroidLibrary> 항목을 추가하여 수행할 수 있습니다.

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

Java 라이브러리를 포함하지만 C# 바인딩을 생성하지 않려면 다음으로 Bind="false"표시합니다.

<ItemGroup>
  <AndroidLibrary Include="mydependency.jar" JavaArtifact="my.library:dependency-library" JavaVersion="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" Version="2.15.0" />
</ItemGroup>