IKVM est une implémentation de Java pour la plateforme Microsoft .NET. Il peut être utilisé pour rapidement et facilement :
Ces tâches peuvent être effectuées sans porter le code source vers .NET.
<MavenReference>
, <IkvmReference>
ou ikvmc
.main()
à exécuter au moment de l'exécution lors de la construction à l'aide de ikvmc
.java
à l'intérieur de l'image d'exécution du JDK. Le bytecode Java est converti à la volée en CIL et exécuté. L'expérience doit être identique à un JDK normal. Diverses différences existent entre la prise en charge de tous nos différents artefacts. Par exemple, il existe certaines plates-formes pour lesquelles nous ne pouvons pas distribuer d'images et d'autres pour lesquelles nous ne pouvons pas distribuer d'outils.
PM> Install-Package IKVM
Ou, pour utiliser MavenReference
:
PM> Install-Package IKVM.Maven.Sdk
Les outils sont disponibles en téléchargement sur la page Releases.
Une image d'exécution JRE et JDK est disponible. Ces images sont des structures de répertoires JRE ou JDK standards contenant tous les outils standards : javac, jdeps, PolicyTool, keytool, etc. Certaines bibliothèques Java peuvent nécessiter soit un JRE, soit un JDK, et si c'est le cas, IKVM.Image.JRE
ou IKVM.Image.JDK
Le package IKVM.Image.JDK
doit être ajouté à votre projet.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
Un distribuable JDK autonome est disponible en téléchargement sur la page Releases. Cette structure de répertoires devrait suffire comme chemin JAVA_HOME
pour les applications Java standard.
IKVM prend en charge l'intégration avec des projets de style SDK .NET ainsi qu'avec des outils de bas niveau pour exécuter directement du code Java compilé ou pour des scénarios de construction avancés. Les 2 principaux points d'entrée pour l'intégration avec les projets de style SDK .NET sont IkvmReference
et MavenReference
. Les projets de style SDK .NET peuvent être créés directement sur la ligne de commande ou à l'aide d'un IDE qui les prend en charge, comme les versions récentes de Visual Studio ou de JetBrains Rider.
IKVM inclut la prise en charge au moment de la construction pour la traduction des bibliothèques Java en assemblys .NET. Installez le package IKVM
dans un projet qui nécessite des références aux bibliothèques Java. Utilisez IkvmReference
dans un ItemGroup
pour indiquer les bibliothèques Java requises par votre projet.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
L'assembly de sortie sera généré dans le cadre du processus de construction de votre projet et une référence sera automatiquement ajoutée à votre projet afin que vous puissiez appeler les API de l'assembly .jar
compilé. Des métadonnées supplémentaires peuvent être ajoutées à IkvmReference
pour personnaliser l'assembly généré.
< 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 >
Les valeurs suivantes peuvent être utilisées comme attribut ou comme élément imbriqué de <IkvmReference>
.
Attribut ou élément | Description |
---|---|
Include (attribut uniquement) | Identité de l'élément IkvmReference . La valeur peut être l'une des suivantes :
|
AssemblyName | Par défaut, AssemblyName est généré à l'aide des règles définies par la spécification Automatic-Module-Name . Pour remplacer cela, faites-le ici. La valeur ne doit pas inclure d'extension de fichier, .dll sera automatiquement ajouté. |
AssemblyVersion | Par défaut, AssemblyVersion est généré à l'aide des règles définies par la spécification Automatic-Module-Name . Pour remplacer cela, faites-le ici. |
AssemblyFileVersion | Par défaut, AssemblyFileVersion est généré à l'aide des règles définies par la spécification Automatic-Module-Name ou, en cas de substitution, la même valeur que AssemblyVersion . Pour remplacer cela, faites-le ici. |
DisableAutoAssemblyName | Si true désactive la détection de AssemblyName . |
DisableAutoAssemblyVersion | Si true désactive la détection de AssemblyVersion . |
FallbackAssemblyName | Si AssemblyName n’est pas fourni ou ne peut pas être calculé, utilisez cette valeur. |
FallbackAssemblyVersion | Si AssemblyVersion n’est pas fourni ou ne peut pas être calculé, utilisez cette valeur. |
KeyFile | Spécifie le nom de fichier contenant la clé cryptographique. Lorsque cette option est utilisée, le compilateur insère la clé publique du fichier spécifié dans le manifeste de l'assembly, puis signe l'assembly final avec la clé privée. |
DelaySign | Cette option amène le compilateur à réserver de l'espace dans le fichier de sortie afin qu'une signature numérique puisse être ajoutée ultérieurement. Utilisez DelaySign si vous souhaitez uniquement placer la clé publique dans l'assembly. L'option DelaySign n'a aucun effet sauf si elle est utilisée avec KeyFile . |
Compile | Une liste séparée par des points-virgules d’éléments de chemin de classe Java à compiler dans l’assembly. Par défaut, cette valeur est l' Identity de l'élément, si l'identité de l'élément est un fichier ou un répertoire JAR existant (pas encore pris en charge). Les globs MSBuild sont pris en charge pour référencer plusieurs fichiers JAR ou .class. |
Sources | Une liste de fichiers source Java séparés par des points-virgules à utiliser lors de la génération de la documentation. (pas encore pris en charge) |
References | Liste facultative séparée par des points-virgules d’autres valeurs d’identité IkvmReference à spécifier comme référence à la valeur actuelle. Par exemple, si foo.jar dépend de bar.jar , incluez les deux comme éléments IkvmReference , mais spécifiez l'identité de bar.jar dans les métadonnées References de foo.jar . |
Debug | Valeur facultative indiquant comment générer des symboles de débogage. Par défaut, cela est déterminé en fonction des propriétés <DebugType> du projet. Seuls les symboles de débogage complet sont actuellement pris en charge. |
Aliases | Une liste d'alias séparés par des points-virgules qui peuvent être utilisés pour référencer l'assembly dans References . |
ClassLoader | Un nom de classe complet de l’implémentation personnalisée de ClassLoader à utiliser comme parent de délégation. Les exemples incluent ikvm.runtime.AppDomainAssemblyClassLoader et ikvm.runtime.ClassPathAssemblyClassLoader . |
Toutes les autres métadonnées prises en charge sur la définition du groupe d’éléments Reference MSBuild. |
IkvmReference
n'est pas transitif. L'inclure dans un projet et ajouter une dépendance à ce projet à partir d'un deuxième projet n'entraînera pas la même référence disponible sur le deuxième projet. Ajoutez plutôt la référence à chaque projet.
Pour que chaque projet soit résolu par le même assemblage résultant, assurez-vous que leurs paramètres sont identiques.
Plusieurs entrées IkvmReference
peuvent être configurées pour s'inclure mutuellement comme références.
< 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
Le Automatic-Module-Name
est soit un attribut spécifié du manifeste JAR, qui se trouve dans le fichier META-INF/MANIFEST.MF
à l'intérieur du JAR, soit une valeur générée basée sur le nom du fichier JAR. Consultez la documentation pour plus d'informations.
Consultez le fichier Readme d'ikvm-maven pour les instructions d'utilisation.
Le projet IKVM recommande aux utilisateurs de ne pas redistribuer les bibliothèques Java FOSS compilées avec IKVM sur des systèmes publics tels que NuGet.org, à moins que vous ne soyez le propriétaire d'origine de ce logiciel et que vous ayez une raison impérieuse.
La création de copies de bibliothèques Java FOSS et leur publication sur des mécanismes de distribution tels que NuGet.org crée une confusion dans l'écosystème et des conflits de dépendances en aval. Nous fournissons un système permettant aux utilisateurs .NET de bibliothèques Java de référencer ces bibliothèques directement à partir des mécanismes standard de l'écosystème Java : Maven Central, etc. via IKVM.Maven. N'oubliez pas que très peu de bibliothèques existent en vase clos. Les bibliothèques dépendent souvent de dizaines d’autres bibliothèques. Deux bibliothèques Java indépendantes dépendent souvent de la même bibliothèque Java sous-jacente. Une méthode complexe de résolution des conflits de dépendances et d'unification des versions doit être impliquée dans la résolution de cette hiérarchie pour tout projet individuel en aval. Vous allez probablement introduire des classes en double chez les utilisateurs de vos versions, ou amener vos utilisateurs à dépendre de la mauvaise version d'autres bibliothèques.
En plus de ce qui précède, nous ne garantissons actuellement pas que l'API entre les assemblys compilés statiquement et les bibliothèques IKVM.Java et IKVM.Runtime reste stable. Il n’est pas garanti qu’un assembly compilé statiquement construit avec une version d’IKVM s’exécute avec une version supérieure d’IKVM, même au niveau du correctif. Nous aimerions annoncer une meilleure prise en charge de cela à l'avenir, mais à l'heure actuelle, de nombreux travaux sont prévus pour les API IKVM.Runtime et IKVM.Java que nous ne voulons pas inhiber. Étant donné que nous fournissons également des outils de build pour faciliter le processus de recompilation des assemblys à partir de la machine de build, si les recommandations sont suivies, cela devrait avoir un impact limité.
Il existe des exceptions à ce conseil, comme la bibliothèque qui n'est pas publiée sur Maven. Dans ce cas, il serait préférable de préconiser que la bibliothèque Java originale soit effectivement publiée sur Maven, ou de faire le travail vous-même, car c'est l'endroit approprié pour les bibliothèques Java.
Nous ne pouvons pas vous obliger à vous conformer à ces conseils. Mais pour la santé de l’écosystème, nous vous invitons à en tenir compte vous-même.