IKVM เป็นการปรับใช้ Java สำหรับแพลตฟอร์ม Microsoft .NET สามารถใช้ได้อย่างรวดเร็วและง่ายดาย:
งานเหล่านี้สามารถทำได้ โดยไม่ต้องย้ายซอร์สโค้ด ไปยัง .NET
<MavenReference>
, <IkvmReference>
หรือ ikvmc
main()
เพื่อดำเนินการที่รันไทม์เมื่อสร้างโดยใช้ ikvmc
java
ภายใน JDK Runtime Image Java bytecode จะถูกแปลงทันทีเป็น 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 ที่คอมไพล์แล้วโดยตรงหรือสำหรับสถานการณ์บิลด์ขั้นสูง จุดเริ่มต้นหลัก 2 ประการสำหรับการผสานรวมกับโปรเจ็กต์สไตล์ .NET SDK คือ IkvmReference
และ MavenReference
โปรเจ็กต์สไตล์ .NET SDK สามารถสร้างได้บนบรรทัดคำสั่งโดยตรง หรือใช้ IDE ที่รองรับ เช่น 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 หรือไดเร็กทอรีที่มีอยู่ (ยังไม่รองรับ) MSBuild globs ได้รับการรองรับเพื่ออ้างอิงไฟล์ 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
เป็นแอ็ตทริบิวต์ที่ระบุของไฟล์ Manifest JAR ซึ่งสามารถพบได้ในไฟล์ META-INF/MANIFEST.MF
ภายใน JAR หรือค่าที่สร้างขึ้นตามชื่อของไฟล์ JAR ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม
ดู ikvm-maven Readme สำหรับคำแนะนำการใช้งาน
โปรเจ็กต์ IKVM แนะนำว่าอย่าแจกจ่ายไลบรารี FOSS Java ที่คอมไพล์ด้วย IKVM ผ่านระบบสาธารณะ เช่น NuGet.org เว้นแต่คุณจะเป็นเจ้าของดั้งเดิมของซอฟต์แวร์นั้นและมีเหตุผลที่น่าสนใจ
การสร้างสำเนาของไลบรารี FOSS Java และเผยแพร่ไปยังกลไกการแจกจ่าย เช่น NuGet.org ทำให้เกิดความสับสนในระบบนิเวศและความขัดแย้งในการพึ่งพาดาวน์สตรีม เราจัดเตรียมระบบเพื่อให้ผู้ใช้ .NET ของไลบรารี Java สามารถอ้างอิงไลบรารีเหล่านั้นได้โดยตรงจากกลไกระบบนิเวศ Java มาตรฐาน: Maven Central ฯลฯ แม้ว่า IKVM.Maven โปรดจำไว้ว่ามีห้องสมุดเพียงไม่กี่แห่งที่อยู่ในสุญญากาศ ห้องสมุดมักขึ้นอยู่กับห้องสมุดอื่นๆ หลายสิบแห่ง ไลบรารี Java สองไลบรารีที่ไม่เกี่ยวข้องกันมักขึ้นอยู่กับไลบรารี Java พื้นฐานเดียวกัน วิธีการที่ซับซ้อนในการแก้ไขข้อขัดแย้งในการขึ้นต่อกันและการรวมเวอร์ชันจะต้องมีส่วนร่วมในการแก้ไขลำดับชั้นนี้สำหรับโปรเจ็กต์ดาวน์สตรีมแต่ละรายการ คุณมีแนวโน้มที่จะแนะนำคลาสที่ซ้ำกันให้กับผู้ใช้เวอร์ชันของคุณ หรือทำให้ผู้ใช้ของคุณขึ้นอยู่กับเวอร์ชันที่ไม่ถูกต้องของไลบรารีอื่น
นอกเหนือจากที่กล่าวมาข้างต้น ในปัจจุบันเราไม่รับประกันว่า API ระหว่างแอสเซมบลีที่คอมไพล์แบบคงที่กับไลบรารี IKVM.Java และ IKVM.Runtime ยังคงมีเสถียรภาพ แอสเซมบลีที่คอมไพล์แบบคงที่ที่สร้างขึ้นสำหรับ IKVM เวอร์ชันเดียวไม่รับประกันว่าจะรันกับ IKVM เวอร์ชันที่สูงกว่า แม้ในระดับแพตช์ก็ตาม เราต้องการโฆษณาการสนับสนุนที่ดีขึ้นสำหรับสิ่งนี้ในอนาคต แต่ในปัจจุบัน มีงานจำนวนมากที่วางแผนไว้สำหรับ IKVM.Runtime และ IKVM.Java API ที่เราไม่ต้องการขัดขวาง เนื่องจากเรายังมีเครื่องมือสร้างเพื่อทำให้กระบวนการคอมไพล์แอสเซมบลีใหม่จากเครื่องสร้างเป็นเรื่องง่าย หากปฏิบัติตามคำแนะนำ สิ่งนี้น่าจะมีผลกระทบที่จำกัด
มีข้อยกเว้นสำหรับคำแนะนำนี้ เช่น ห้องสมุดไม่ได้รับการเผยแพร่ไปยัง Maven ในกรณีดังกล่าว คำแนะนำคือสนับสนุนให้เผยแพร่ไลบรารี Java ดั้งเดิมไปยัง Maven หรือดำเนินการด้วยตนเอง เนื่องจากเป็นสถานที่ที่เหมาะสมสำหรับไลบรารี Java
เราไม่สามารถบังคับให้คุณปฏิบัติตามคำแนะนำนี้ได้ แต่เพื่อสุขภาพที่ดีของระบบนิเวศ เราขอแนะนำให้คุณพิจารณาด้วยตัวเอง