IKVM은 Microsoft .NET 플랫폼용 Java 구현입니다. 빠르고 쉽게 다음을 수행하는 데 사용할 수 있습니다.
이러한 작업은 소스 코드를 .NET으로 이식하지 않고도 수행할 수 있습니다.
<MavenReference>
, <IkvmReference>
또는 ikvmc
사용하여 Java 애플리케이션을 .NET 어셈블리로 컴파일합니다.ikvmc
사용하여 빌드할 때 런타임에 실행할 main()
메서드가 포함된 클래스를 지정하여 실행 가능한 어셈블리를 시작할 수 있습니다.java
실행 파일을 사용하여 Java 애플리케이션을 실행합니다. Java 바이트코드는 즉시 CIL로 변환되어 실행됩니다. 환경은 일반 JDK와 동일해야 합니다. 다양한 아티팩트에 대한 지원 간에는 다양한 차이점이 있습니다. 예를 들어, 이미지를 배포할 수 없는 플랫폼과 도구를 배포할 수 없는 플랫폼이 있습니다.
PM> Install-Package IKVM
또는 MavenReference
사용하려면 다음을 수행하세요.
PM> Install-Package IKVM.Maven.Sdk
도구는 릴리스 페이지에서 다운로드할 수 있습니다.
JRE 및 JDK 런타임 이미지를 모두 사용할 수 있습니다. 이러한 이미지는 javac, jdeps,policytool,keytool 등 모든 표준 도구를 포함하는 표준 JRE 또는 JDK 디렉토리 구조입니다. 일부 Java 라이브러리에는 JRE 또는 JDK가 필요할 수 있으며, 필요한 경우 IKVM.Image.JRE
또는 IKVM.Image.JDK
패키지를 프로젝트에 추가해야 합니다.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
독립형 JDK 배포 가능 파일은 릴리스 페이지에서 다운로드할 수 있습니다. 이 디렉토리 구조는 표준 Java 애플리케이션의 JAVA_HOME
경로로 충분합니다.
IKVM은 .NET SDK 스타일 프로젝트와의 통합은 물론 컴파일된 Java 코드를 직접 실행하거나 고급 빌드 시나리오를 위한 하위 수준 도구를 지원합니다. .NET SDK 스타일 프로젝트와의 통합을 위한 두 가지 주요 진입점은 IkvmReference
및 MavenReference
입니다. .NET SDK 스타일 프로젝트는 명령줄에서 직접 빌드하거나 최신 버전의 Visual Studio 또는 JetBrains Rider와 같이 이를 지원하는 IDE를 사용하여 빌드할 수 있습니다.
IKVM에는 Java 라이브러리를 .NET 어셈블리로 변환하기 위한 빌드 타임 지원이 포함되어 있습니다. Java 라이브러리에 대한 참조가 필요한 프로젝트에 IKVM
패키지를 설치합니다. ItemGroup
내에서 IkvmReference
사용하여 프로젝트에 필요한 Java 라이브러리를 나타냅니다.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
출력 어셈블리는 프로젝트 빌드 프로세스의 일부로 생성되며 컴파일된 .jar
어셈블리의 API를 호출할 수 있도록 참조가 프로젝트에 자동으로 추가됩니다. 추가 메타데이터를 IkvmReference
에 추가하여 생성되는 어셈블리를 사용자 지정할 수 있습니다.
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " >
< AssemblyName >MyAssembly</ AssemblyName >
< AssemblyVersion >3.2.1.0</ AssemblyVersion >
< AssemblyFileVersion >3.0.0.0</ AssemblyFileVersion >
< DisableAutoAssemblyName >true</ DisableAutoAssemblyName >
< DisableAutoAssemblyVersion >true</ DisableAutoAssemblyVersion >
< FallbackAssemblyName >MyAssemblyFallback</ FallbackAssemblyName >
< FallbackAssemblyVersion >3.1.0.0</ FallbackAssemblyVersion >
< KeyFile >MyKey.snk</ KeyFile >
< DelaySign >true</ DelaySign >
< Compile >SomeInternalDependency.jar;SomeOtherInternalDependency.jar</ Compile >
< Sources >MyClass.java;YourClass.java</ Sources >
< References >SomeExternalDependency.jar;SomeOtherExternalDependency.jar</ References >
< Aliases >MyAssemblyAlias;helloworld2_0</ Aliases >
< Debug >portable</ Debug >
</ IkvmReference >
</ ItemGroup >
다음 값은 <IkvmReference>
의 속성 또는 중첩 요소로 사용될 수 있습니다.
속성 또는 요소 | 설명 |
---|---|
Include (속성만) | IkvmReference 항목의 ID입니다. 값은 다음 중 하나일 수 있습니다.
|
AssemblyName | 기본적으로 AssemblyName Automatic-Module-Name 사양에 정의된 규칙을 사용하여 생성됩니다. 이를 재정의하려면 여기에서 수행하십시오. 값에는 파일 확장자가 포함되어서는 안 됩니다. .dll 자동으로 추가됩니다. |
AssemblyVersion | 기본적으로 AssemblyVersion Automatic-Module-Name 사양에 정의된 규칙을 사용하여 생성됩니다. 이를 재정의하려면 여기에서 수행하십시오. |
AssemblyFileVersion | 기본적으로 AssemblyFileVersion Automatic-Module-Name 사양에 정의된 규칙을 사용하거나 재정의된 경우 AssemblyVersion 과 동일한 값을 사용하여 생성됩니다. 이를 재정의하려면 여기에서 수행하십시오. |
DisableAutoAssemblyName | true 인 경우 AssemblyName 감지가 비활성화됩니다. |
DisableAutoAssemblyVersion | true 인 경우 AssemblyVersion 감지가 비활성화됩니다. |
FallbackAssemblyName | AssemblyName 이 제공되지 않거나 계산할 수 없는 경우 이 값을 사용합니다. |
FallbackAssemblyVersion | AssemblyVersion 이 제공되지 않거나 계산할 수 없는 경우 이 값을 사용합니다. |
KeyFile | 암호화 키가 포함된 파일 이름을 지정합니다. 이 옵션을 사용하면 컴파일러는 지정된 파일의 공개 키를 어셈블리 매니페스트에 삽입한 다음 개인 키로 최종 어셈블리에 서명합니다. |
DelaySign | 이 옵션을 사용하면 나중에 디지털 서명을 추가할 수 있도록 컴파일러가 출력 파일에 공간을 예약하게 됩니다. 어셈블리에 공개 키만 배치하려면 DelaySign 사용하세요. DelaySign 옵션은 KeyFile 과 함께 사용하지 않는 한 아무런 효과가 없습니다. |
Compile | 어셈블리로 컴파일할 Java 클래스 경로 항목의 세미콜론으로 구분된 목록입니다. 항목의 ID가 기존 JAR 파일 또는 디렉터리(아직 지원되지 않음)인 경우 기본적으로 이 값은 항목의 Identity 입니다. MSBuild glob은 여러 JAR 또는 .class 파일을 참조하도록 지원됩니다. |
Sources | 문서 생성 중에 사용할 Java 소스 파일의 세미콜론으로 구분된 목록입니다. (아직 지원되지 않음) |
References | 현재 항목에 대한 참조로 지정할 다른 IkvmReference ID 값의 선택적인 세미콜론으로 구분된 목록입니다. 예를 들어, foo.jar bar.jar 에 의존하는 경우 둘 다 IkvmReference 항목으로 포함하되 foo.jar 의 References 메타데이터에 bar.jar 의 ID를 지정합니다. |
Debug | 디버그 기호를 생성하는 방법을 나타내는 선택적 값입니다. 기본적으로 이는 프로젝트의 <DebugType> 속성에 따라 결정됩니다. 현재는 전체 디버그 기호만 지원됩니다. |
Aliases | References 에서 어셈블리를 참조하는 데 사용할 수 있는 세미콜론으로 구분된 별칭 목록입니다. |
ClassLoader | 위임 부모로 사용할 사용자 정의 ClassLoader 구현의 정규화된 클래스 이름입니다. 예에는 ikvm.runtime.AppDomainAssemblyClassLoader 및 ikvm.runtime.ClassPathAssemblyClassLoader 가 포함됩니다. |
Reference MSBuild 항목 그룹 정의에서 지원되는 기타 모든 메타데이터입니다. |
IkvmReference
전이적이지 않습니다. 이를 하나의 프로젝트에 포함하고 두 번째 프로젝트에서 해당 프로젝트에 종속성을 추가하면 두 번째 프로젝트에서 동일한 참조를 사용할 수 없게 됩니다. 대신 각 프로젝트에 대한 참조를 추가하세요.
동일한 결과 어셈블리로 해석하려면 각 프로젝트의 설정이 동일한지 확인하세요.
서로를 참조로 포함하도록 여러 IkvmReference
항목을 구성할 수 있습니다.
< ItemGroup >
< IkvmReference Include = " helloworld.jar " >
< AssemblyVersion >1.0.0.0</ AssemblyVersion >
</ IkvmReference >
< IkvmReference Include = " helloworld-2.jar " >
< AssemblyName >helloworld-2</ AssemblyName >
< AssemblyVersion >2.0.0.0</ AssemblyVersion >
< References >helloworld.jar</ References >
< Aliases >helloworld2</ Aliases >
</ IkvmReference >
</ ItemGroup >
Automatic-Module-Name
사양 Automatic-Module-Name
은 JAR 내부의 META-INF/MANIFEST.MF
파일에서 찾을 수 있는 JAR 매니페스트의 지정된 속성이거나 JAR 파일의 이름을 기반으로 생성된 값입니다. 자세한 내용은 설명서를 참조하세요.
사용 지침은 ikvm-maven Readme를 참조하세요.
IKVM 프로젝트에서는 사용자가 해당 소프트웨어의 원래 소유자이거나 설득력 있는 이유가 없는 한 IKVM으로 컴파일된 FOSS Java 라이브러리를 NuGet.org와 같은 공용 시스템을 통해 재배포하지 않을 것을 권장합니다.
FOSS Java 라이브러리의 복사본을 만들고 NuGet.org와 같은 배포 메커니즘에 게시하면 다운스트림에서 생태계 혼란과 종속성 충돌이 발생합니다. 우리는 Java 라이브러리의 .NET 사용자가 IKVM.Maven을 통해 표준 Java 생태계 메커니즘(Maven Central 등)에서 해당 라이브러리를 직접 참조할 수 있도록 시스템을 제공합니다. 진공 상태로 존재하는 라이브러리는 거의 없다는 점을 기억하십시오. 라이브러리는 종종 수십 개의 다른 라이브러리에 의존합니다. 서로 관련되지 않은 두 개의 Java 라이브러리는 동일한 기본 Java 라이브러리에 의존하는 경우가 많습니다. 개별 다운스트림 프로젝트에 대한 이 계층 구조를 해결하려면 종속성 충돌 해결 및 버전 통합의 복잡한 방법이 포함되어야 합니다. 귀하 버전의 사용자에게 중복 클래스를 도입하거나 사용자가 잘못된 버전의 다른 라이브러리에 의존하게 만들 가능성이 높습니다.
위 사항 외에도 현재 정적으로 컴파일된 어셈블리와 IKVM.Java 및 IKVM.Runtime 라이브러리 간의 API가 안정적으로 유지된다는 보장이 없습니다. 한 버전의 IKVM에 대해 구축된 정적으로 컴파일된 어셈블리는 패치 수준에서도 더 높은 버전의 IKVM에 대해 실행되도록 보장되지 않습니다. 앞으로 이에 대한 더 나은 지원을 광고하고 싶지만 현재 IKVM.Runtime 및 IKVM.Java API에 대해 계획된 많은 작업이 있어 방해하고 싶지 않습니다. 또한 빌드 머신에서 어셈블리를 쉽게 다시 컴파일하는 프로세스를 만들기 위한 빌드 도구도 제공하므로 권장 사항을 따르면 영향이 제한적입니다.
이 조언에는 라이브러리가 Maven에 게시되지 않는 등의 예외가 있습니다. 이 경우 원래 Java 라이브러리가 실제로 Maven에 게시되도록 옹호하거나 Java 라이브러리에 적합한 위치이므로 직접 작업을 수행하라는 지침이 될 것입니다.
우리는 귀하에게 이 조언을 따르도록 강요할 수 없습니다. 하지만 생태계의 건강을 위해서는 스스로 고려하시길 바랍니다.