IKVM — это реализация Java для платформы Microsoft .NET. С его помощью можно быстро и легко:
Эти задачи можно выполнить без переноса исходного кода на .NET.
<MavenReference>
, <IkvmReference>
или ikvmc
.main()
который будет выполняться во время выполнения при сборке с использованием ikvmc
.java
внутри образа времени выполнения JDK. Байт-код Java преобразуется на лету в CIL и выполняется. Опыт должен быть идентичен обычному JDK. Существуют различные различия между поддержкой всех наших различных артефактов. Например, для некоторых платформ мы не можем распространять изображения, а для некоторых платформ мы не можем распространять инструменты.
PM> Install-Package IKVM
Или, чтобы использовать MavenReference
:
PM> Install-Package IKVM.Maven.Sdk
Инструменты доступны для загрузки на странице «Релизы».
Доступны как образы среды выполнения JRE, так и JDK. Эти образы представляют собой стандартные структуры каталогов JRE или JDK, содержащие все стандартные инструменты: javac, jdeps, policytool, keytool и т. д. Некоторым библиотекам Java может потребоваться JRE или JDK, и если да, то IKVM.Image.JRE
или IKVM.Image.JDK
Пакет IKVM.Image.JDK
должен быть добавлен в ваш проект.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
Автономный дистрибутив JDK доступен для загрузки на странице «Релизы». Этой структуры каталогов должно быть достаточно в качестве пути JAVA_HOME
для стандартных приложений Java.
IKVM поддерживает интеграцию с проектами в стиле .NET SDK, а также инструменты низкого уровня для прямого запуска скомпилированного кода Java или для расширенных сценариев сборки. Двумя основными точками входа для интеграции с проектами в стиле .NET SDK являются IkvmReference
и MavenReference
. Проекты в стиле .NET SDK можно создавать непосредственно в командной строке или с помощью поддерживающей их среды разработки, например последних версий Visual Studio или JetBrains Rider.
IKVM включает поддержку перевода библиотек Java в сборки .NET во время сборки. Установите пакет IKVM
в проект, для которого требуются ссылки на библиотеки Java. Используйте IkvmReference
в ItemGroup
чтобы указать, какие библиотеки Java требуются вашему проекту.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
Выходная сборка будет создана как часть процесса сборки вашего проекта, и в ваш проект будет автоматически добавлена ссылка, чтобы вы могли вызывать API скомпилированной сборки .jar
. В 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 . Значение может быть одним из:
|
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 для компиляции в сборку. По умолчанию это значение — Identity элемента, если идентификатор элемента — это существующий файл JAR или каталог (пока не поддерживается). Поддерживаются glob MSBuild для ссылки на несколько файлов JAR или .class. |
Sources | Список исходных файлов Java, разделенных точкой с запятой, которые будут использоваться при создании документации. (пока не поддерживается) |
References | Необязательный список других значений идентификаторов IkvmReference разделенных точкой с запятой, которые можно указать в качестве ссылки на текущий. Например, если foo.jar зависит от bar.jar , включите оба элемента как IkvmReference , но укажите идентификатор bar.jar в метаданных References файла foo.jar . |
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. Дополнительную информацию смотрите в документации.
Инструкции по использованию см. в файле Readme ikvm-maven.
Проект IKVM рекомендует людям не распространять Java-библиотеки FOSS, скомпилированные с помощью IKVM, в общедоступных системах, таких как NuGet.org, если только вы не являетесь первоначальным владельцем этого программного обеспечения и не имеете веских причин.
Создание копий Java-библиотек FOSS и их публикация в механизмах распространения, таких как NuGet.org, приводит к путанице в экосистеме и конфликтам зависимостей в дальнейшем. Мы предоставляем систему, позволяющую пользователям .NET библиотек Java ссылаться на эти библиотеки непосредственно из стандартных механизмов экосистемы Java: Maven Central и т. д. через IKVM.Maven. Помните, очень немногие библиотеки существуют в вакууме. Библиотеки часто зависят от десятков других библиотек. Две несвязанные библиотеки Java часто зависят от одной и той же базовой библиотеки Java. Для разрешения этой иерархии для любого отдельного последующего проекта должен использоваться сложный метод разрешения конфликтов зависимостей и унификации версий. Вероятно, вы собираетесь вводить повторяющиеся классы для пользователей ваших версий или заставлять ваших пользователей зависеть от неправильных версий других библиотек.
Помимо вышесказанного, в настоящее время мы не гарантируем, что API между статически скомпилированными сборками и библиотеками IKVM.Java и IKVM.Runtime остается стабильным. Статически скомпилированная сборка, созданная для одной версии IKVM, не гарантируется для работы с более поздней версией IKVM, даже на уровне исправления. Мы хотели бы объявить об улучшении поддержки этого в будущем, но в настоящее время запланировано много работы над API IKVM.Runtime и IKVM.Java, которую мы не хотим тормозить. Поскольку мы также предоставляем инструменты сборки, упрощающие процесс перекомпиляции сборок с машины сборки, при соблюдении рекомендаций это будет иметь ограниченный эффект.
Из этого совета есть исключения, например, библиотека не публикуется в Maven. В этом случае рекомендуется рекомендовать опубликовать исходную библиотеку Java в Maven или выполнить всю работу самостоятельно, поскольку это подходящее место для библиотек Java.
Мы не можем заставить вас следовать этому совету. Но ради здоровья экосистемы мы призываем вас принять это во внимание.