IKVM ist eine Implementierung von Java für die Microsoft .NET-Plattform. Damit können Sie schnell und einfach:
Diese Aufgaben können ohne Portierung des Quellcodes nach .NET erledigt werden.
<MavenReference>
, <IkvmReference>
oder ikvmc
.ikvmc
die Klasse angegeben wird, die die Methode main()
enthält, die zur Laufzeit ausgeführt werden soll.java
Datei im JDK-Laufzeitbild. Der Java-Bytecode wird im laufenden Betrieb in CIL konvertiert und ausgeführt. Das Erlebnis sollte mit einem normalen JDK identisch sein. Es gibt verschiedene Unterschiede bei der Unterstützung aller unserer verschiedenen Artefakte. Beispielsweise gibt es einige Plattformen, für die wir keine Bilder vertreiben können, und für einige Plattformen können wir keine Tools vertreiben.
PM> Install-Package IKVM
Oder um MavenReference
zu verwenden:
PM> Install-Package IKVM.Maven.Sdk
Die Tools stehen auf der Seite „Releases“ zum Download bereit.
Es sind sowohl ein JRE- als auch ein JDK-Laufzeitimage verfügbar. Bei diesen Bildern handelt es sich um Standard-JRE- oder JDK-Verzeichnisstrukturen, die alle Standardtools enthalten: javac, jdeps, Policytool, Keytool usw. Einige Java-Bibliotheken erfordern möglicherweise entweder ein JRE oder ein JDK und in diesem Fall IKVM.Image.JRE
oder IKVM.Image.JDK
Paket sollte Ihrem Projekt hinzugefügt werden.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
Ein eigenständiges verteilbares JDK steht auf der Seite „Releases“ zum Download bereit. Diese Verzeichnisstruktur sollte als JAVA_HOME
-Pfad für Standard-Java-Anwendungen ausreichen.
IKVM unterstützt die Integration in Projekte im .NET SDK-Stil sowie Low-Level-Tools zum direkten Ausführen von kompiliertem Java-Code oder für erweiterte Build-Szenarien. Die beiden Haupteinstiegspunkte für die Integration mit Projekten im .NET SDK-Stil sind IkvmReference
und MavenReference
. Projekte im .NET SDK-Stil können direkt in der Befehlszeile oder mithilfe einer IDE erstellt werden, die sie unterstützt, z. B. neuere Versionen von Visual Studio oder JetBrains Rider.
IKVM bietet Build-Time-Unterstützung für die Übersetzung von Java-Bibliotheken in .NET-Assemblys. Installieren Sie das IKVM
-Paket in einem Projekt, das Verweise auf Java-Bibliotheken erfordert. Verwenden Sie IkvmReference
innerhalb einer ItemGroup
um anzugeben, welche Java-Bibliotheken Ihr Projekt benötigt.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
Die Ausgabe-Assembly wird im Rahmen des Build-Prozesses Ihres Projekts generiert und Ihrem Projekt wird automatisch eine Referenz hinzugefügt, damit Sie APIs der kompilierten .jar
Assembly aufrufen können. IkvmReference
können zusätzliche Metadaten hinzugefügt werden, um die generierte Assembly anzupassen.
< 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 >
Die folgenden Werte können entweder als Attribut oder als verschachteltes Element von <IkvmReference>
verwendet werden.
Attribut oder Element | Beschreibung |
---|---|
Include (nur Attribut) | Die Identität des IkvmReference Elements. Der Wert kann einer der folgenden sein:
|
AssemblyName | Standardmäßig wird der AssemblyName anhand der Regeln generiert, die in der Spezifikation „ Automatic-Module-Name definiert sind. Um dies zu überschreiben, können Sie dies hier tun. Der Wert sollte keine Dateierweiterung enthalten, .dll wird automatisch angehängt. |
AssemblyVersion | Standardmäßig wird die AssemblyVersion anhand der Regeln generiert, die in der Spezifikation „ Automatic-Module-Name definiert sind. Um dies zu überschreiben, können Sie dies hier tun. |
AssemblyFileVersion | Standardmäßig wird die AssemblyFileVersion mithilfe der durch die Automatic-Module-Name Spezifikation definierten Regeln oder, falls überschrieben, mit demselben Wert wie AssemblyVersion generiert. Um dies zu überschreiben, können Sie dies hier tun. |
DisableAutoAssemblyName | Wenn true wird die Erkennung von AssemblyName deaktiviert. |
DisableAutoAssemblyVersion | Wenn true wird die Erkennung von AssemblyVersion deaktiviert. |
FallbackAssemblyName | Wenn AssemblyName nicht bereitgestellt wird oder nicht berechnet werden kann, verwenden Sie diesen Wert. |
FallbackAssemblyVersion | Wenn AssemblyVersion nicht bereitgestellt wird oder nicht berechnet werden kann, verwenden Sie diesen Wert. |
KeyFile | Gibt den Dateinamen an, der den kryptografischen Schlüssel enthält. Wenn diese Option verwendet wird, fügt der Compiler den öffentlichen Schlüssel aus der angegebenen Datei in das Assembly-Manifest ein und signiert dann die endgültige Assembly mit dem privaten Schlüssel. |
DelaySign | Diese Option bewirkt, dass der Compiler Platz in der Ausgabedatei reserviert, damit später eine digitale Signatur hinzugefügt werden kann. Verwenden Sie DelaySign wenn Sie nur den öffentlichen Schlüssel in der Assembly platzieren möchten. Die DelaySign -Option hat keine Auswirkung, es sei denn, sie wird mit KeyFile verwendet. |
Compile | Eine durch Semikolons getrennte Liste von Java-Klassenpfadelementen, die in die Assembly kompiliert werden sollen. Standardmäßig ist dieser Wert die Identity des Elements, wenn die Identität des Elements eine vorhandene JAR-Datei oder ein vorhandenes JAR-Verzeichnis ist (noch nicht unterstützt). MSBuild-Globs werden unterstützt, um auf mehrere JAR- oder .class-Dateien zu verweisen. |
Sources | Eine durch Semikolons getrennte Liste von Java-Quelldateien, die während der Dokumentationserstellung verwendet werden sollen. (noch nicht unterstützt) |
References | Optionale durch Semikolons getrennte Liste anderer IkvmReference Identitätswerte, die als Referenz auf den aktuellen Wert angegeben werden sollen. Wenn foo.jar beispielsweise von bar.jar abhängt, schließen Sie beide als IkvmReference Elemente ein, geben Sie jedoch die Identität von bar.jar in den References von foo.jar an. |
Debug | Optionaler Wert, der angibt, wie Debugsymbole generiert werden. Standardmäßig wird dies basierend auf den <DebugType> -Eigenschaften des Projekts bestimmt. Derzeit werden nur vollständige Debugsymbole unterstützt. |
Aliases | Eine durch Semikolons getrennte Liste von Aliasen, die zum Referenzieren der Assembly in References verwendet werden können. |
ClassLoader | Ein vollständig qualifizierter Klassenname der benutzerdefinierten ClassLoader-Implementierung, die als übergeordnetes Delegierungselement verwendet werden soll. Beispiele hierfür sind ikvm.runtime.AppDomainAssemblyClassLoader und ikvm.runtime.ClassPathAssemblyClassLoader . |
Alle anderen Metadaten, die in der Reference MSBuild-Elementgruppendefinition unterstützt werden. |
IkvmReference
ist nicht transitiv. Das Einschließen in ein Projekt und das Hinzufügen einer Abhängigkeit von einem zweiten Projekt zu diesem Projekt führt nicht dazu, dass dieselbe Referenz im zweiten Projekt verfügbar ist. Fügen Sie stattdessen den Verweis zu jedem Projekt hinzu.
Damit jedes Projekt in dieselbe resultierende Baugruppe aufgelöst wird, stellen Sie sicher, dass ihre Einstellungen identisch sind.
Mehrere IkvmReference
Einträge können so konfiguriert werden, dass sie sich gegenseitig als Referenzen einschließen.
< 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
Der Automatic-Module-Name
ist entweder ein angegebenes Attribut des JAR-Manifests, das in der Datei META-INF/MANIFEST.MF
im JAR zu finden ist, oder ein generierter Wert, der auf dem Namen der JAR-Datei basiert. Weitere Informationen finden Sie in der Dokumentation.
Anweisungen zur Verwendung finden Sie in der Readme-Datei zu ikvm-maven.
Das IKVM-Projekt empfiehlt, mit IKVM kompilierte FOSS-Java-Bibliotheken nicht über öffentliche Systeme wie NuGet.org weiterzuverbreiten, es sei denn, Sie sind der ursprüngliche Eigentümer dieser Software und haben einen zwingenden Grund.
Das Erstellen von Kopien von FOSS-Java-Bibliotheken und deren Veröffentlichung auf Verteilungsmechanismen wie NuGet.org führt zu Verwirrung im Ökosystem und nachgelagerten Abhängigkeitskonflikten. Wir stellen ein System bereit, mit dem .NET-Benutzer von Java-Bibliotheken diese Bibliotheken direkt über die Standardmechanismen des Java-Ökosystems referenzieren können: Maven Central usw. über IKVM.Maven. Denken Sie daran, dass nur sehr wenige Bibliotheken im luftleeren Raum existieren. Bibliotheken sind oft auf Dutzende anderer Bibliotheken angewiesen. Zwei nicht verwandte Java-Bibliotheken hängen häufig von derselben zugrunde liegenden Java-Bibliothek ab. Um diese Hierarchie für jedes einzelne nachgelagerte Projekt aufzulösen, muss eine komplexe Methode zur Lösung von Abhängigkeitskonflikten und zur Versionsvereinheitlichung eingesetzt werden. Sie werden wahrscheinlich doppelte Klassen bei den Benutzern Ihrer Versionen einführen oder dazu führen, dass Ihre Benutzer von der falschen Version anderer Bibliotheken abhängig sind.
Darüber hinaus können wir derzeit nicht garantieren, dass die API zwischen statisch kompilierten Assemblys und den Bibliotheken IKVM.Java und IKVM.Runtime stabil bleibt. Es ist nicht garantiert, dass eine statisch kompilierte Assembly, die für eine Version von IKVM erstellt wurde, auch auf Patch-Ebene mit einer höheren Version von IKVM ausgeführt werden kann. Wir möchten hierfür in Zukunft eine bessere Unterstützung ankündigen, derzeit sind jedoch noch viele Arbeiten für die IKVM.Runtime- und IKVM.Java-APIs geplant, die wir nicht behindern möchten. Da wir auch Build-Tools bereitstellen, um den Prozess der Neukompilierung von Baugruppen aus der Build-Maschine zu vereinfachen, sollte dies nur begrenzte Auswirkungen haben, wenn die Empfehlungen befolgt werden.
Es gibt Ausnahmen von diesem Hinweis, z. B. wenn die Bibliothek nicht in Maven veröffentlicht wird. In diesem Fall wäre es empfehlenswert, dafür zu plädieren, dass die ursprüngliche Java-Bibliothek tatsächlich in Maven veröffentlicht wird, oder die Arbeit selbst zu erledigen, da dies der geeignete Ort für Java-Bibliotheken ist.
Wir können Sie nicht zwingen, diesem Rat Folge zu leisten. Für die Gesundheit des Ökosystems empfehlen wir Ihnen jedoch dringend, selbst darüber nachzudenken.