IKVM es una implementación de Java para la plataforma Microsoft .NET. Se puede utilizar para rápida y fácilmente:
Estas tareas se pueden realizar sin portar el código fuente a .NET.
<MavenReference>
, <IkvmReference>
o ikvmc
.main()
para ejecutar en tiempo de ejecución cuando se construye usando ikvmc
.java
dentro de la imagen de tiempo de ejecución JDK. El código de bytes de Java se convierte sobre la marcha a CIL y se ejecuta. La experiencia debería ser idéntica a la de un JDK normal. Existen varias diferencias entre el soporte para todos nuestros diferentes artefactos. Por ejemplo, hay algunas plataformas para las que no podemos distribuir imágenes y algunas plataformas para las que no podemos distribuir herramientas.
PM> Install-Package IKVM
O, para usar MavenReference
:
PM> Install-Package IKVM.Maven.Sdk
Las herramientas están disponibles para descargar en la página de Lanzamientos.
Están disponibles una imagen de tiempo de ejecución JRE y JDK. Estas imágenes son estructuras de directorio JRE o JDK estándar que contienen todas las herramientas estándar: javac, jdeps, Policytool, keytool, etc. Algunas bibliotecas Java pueden requerir un JRE o un JDK y, de ser así, IKVM.Image.JRE
o IKVM.Image.JDK
El paquete IKVM.Image.JDK
debe agregarse a su proyecto.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
Un distribuible JDK independiente está disponible para descargar en la página de Lanzamientos. Esta estructura de directorio debería ser suficiente como ruta JAVA_HOME
para aplicaciones Java estándar.
IKVM admite la integración con proyectos de estilo .NET SDK, así como herramientas de bajo nivel para ejecutar código Java compilado directamente o para escenarios de compilación avanzados. Los dos puntos de entrada principales para la integración con proyectos de estilo .NET SDK son IkvmReference
y MavenReference
. Los proyectos de estilo .NET SDK se pueden crear directamente en la línea de comandos o utilizando un IDE que los admita, como las versiones recientes de Visual Studio o JetBrains Rider.
IKVM incluye soporte en tiempo de compilación para traducir bibliotecas Java a ensamblados .NET. Instale el paquete IKVM
en un proyecto que requiera referencias a bibliotecas de Java. Utilice IkvmReference
dentro de un ItemGroup
para indicar qué bibliotecas Java requiere su proyecto.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
El ensamblado de salida se generará como parte del proceso de compilación de su proyecto y se agregará automáticamente una referencia a su proyecto para que pueda llamar a las API del ensamblado .jar
compilado. Se pueden agregar metadatos adicionales a IkvmReference
para personalizar el ensamblado que se genera.
< 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 >
Los siguientes valores se pueden utilizar como atributo o como elemento anidado de <IkvmReference>
.
Atributo o elemento | Descripción |
---|---|
Include (solo atributo) | La identidad del elemento IkvmReference . El valor puede ser uno de:
|
AssemblyName | De forma predeterminada, AssemblyName se genera utilizando las reglas definidas por la especificación Automatic-Module-Name . Para anular esto, hágalo aquí. El valor no debe incluir una extensión de archivo; .dll se agregará automáticamente. |
AssemblyVersion | De forma predeterminada, AssemblyVersion se genera utilizando las reglas definidas por la especificación Automatic-Module-Name . Para anular esto, hágalo aquí. |
AssemblyFileVersion | De forma predeterminada, AssemblyFileVersion se genera utilizando las reglas definidas por la especificación Automatic-Module-Name o, si se anula, el mismo valor que AssemblyVersion . Para anular esto, hágalo aquí. |
DisableAutoAssemblyName | Si true se desactiva la detección de AssemblyName . |
DisableAutoAssemblyVersion | Si true se desactiva la detección de AssemblyVersion . |
FallbackAssemblyName | Si no se proporciona AssemblyName o no se puede calcular, utilice este valor. |
FallbackAssemblyVersion | Si no se proporciona AssemblyVersion o no se puede calcular, utilice este valor. |
KeyFile | Especifica el nombre del archivo que contiene la clave criptográfica. Cuando se utiliza esta opción, el compilador inserta la clave pública del archivo especificado en el manifiesto del ensamblado y luego firma el ensamblado final con la clave privada. |
DelaySign | Esta opción hace que el compilador reserve espacio en el archivo de salida para poder agregar una firma digital más adelante. Utilice DelaySign si solo desea colocar la clave pública en el ensamblaje. La opción DelaySign no tiene ningún efecto a menos que se use con KeyFile . |
Compile | Una lista separada por punto y coma de elementos de la ruta de clases de Java para compilar en el ensamblado. De forma predeterminada, este valor es la Identity del elemento, si la identidad del elemento es un archivo o directorio JAR existente (aún no compatible). Se admiten globs de MSBuild para hacer referencia a varios archivos JAR o .class. |
Sources | Una lista separada por punto y coma de archivos fuente de Java que se utilizarán durante la generación de documentación. (aún no es compatible) |
References | Lista opcional separada por punto y coma de otros valores de identidad IkvmReference para especificar como referencia al actual. Por ejemplo, si foo.jar depende de bar.jar , incluya ambos como elementos IkvmReference , pero especifique la identidad de bar.jar en los metadatos de References de foo.jar . |
Debug | Valor opcional que indica cómo generar símbolos de depuración. De forma predeterminada, esto se determina en función de las propiedades <DebugType> del proyecto. Actualmente solo se admiten símbolos de depuración completos. |
Aliases | Una lista de alias separados por punto y coma que se pueden utilizar para hacer referencia al ensamblado en References . |
ClassLoader | Un nombre de clase completo de la implementación personalizada de ClassLoader que se utilizará como padre de delegación. Los ejemplos incluyen ikvm.runtime.AppDomainAssemblyClassLoader y ikvm.runtime.ClassPathAssemblyClassLoader . |
Todos los demás metadatos admitidos en la definición del grupo de elementos de MSBuild Reference . |
IkvmReference
no es transitivo. Incluirlo en un proyecto y agregar una dependencia a ese proyecto desde un segundo proyecto no dará como resultado que la misma referencia esté disponible en el segundo proyecto. En su lugar, agregue la referencia a cada proyecto.
Para que cada proyecto se resuelva en el mismo ensamblaje resultante, asegúrese de que sus configuraciones sean idénticas.
Se pueden configurar varias entradas IkvmReference
para incluirse entre sí como referencias.
< 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
El Automatic-Module-Name
es un atributo especificado del manifiesto JAR, que se puede encontrar en el archivo META-INF/MANIFEST.MF
dentro del JAR, o un valor generado en función del nombre del archivo JAR. Consulte la documentación para obtener más información.
Consulte el archivo Léame de ikvm-maven para obtener instrucciones de uso.
El proyecto IKVM recomienda que las personas no redistribuyan bibliotecas FOSS Java compiladas con IKVM a través de sistemas públicos como NuGet.org, a menos que usted sea el propietario original de ese software y tenga una razón de peso.
Crear copias de bibliotecas FOSS Java y publicarlas en mecanismos de distribución como NuGet.org crea confusión en el ecosistema y conflictos de dependencia posteriores. Proporcionamos un sistema para que los usuarios .NET de bibliotecas Java puedan hacer referencia a esas bibliotecas directamente desde los mecanismos estándar del ecosistema Java: Maven Central, etc. a través de IKVM.Maven. Recuerde, muy pocas bibliotecas existen en el vacío. Las bibliotecas a menudo dependen de docenas de otras bibliotecas. Dos bibliotecas Java no relacionadas a menudo dependen de la misma biblioteca Java subyacente. Para resolver esta jerarquía para cualquier proyecto individual, es necesario contar con un método complejo de resolución de conflictos de dependencias y unificación de versiones. Probablemente introducirá clases duplicadas en los usuarios de sus versiones o hará que sus usuarios dependan de la versión incorrecta de otras bibliotecas.
Además de lo anterior, actualmente no garantizamos que la API entre ensamblados compilados estáticamente y las bibliotecas IKVM.Java e IKVM.Runtime permanezca estable. No se garantiza que un ensamblado compilado estáticamente creado con una versión de IKVM se ejecute con una versión superior de IKVM, incluso a nivel de parche. Nos gustaría anunciar un mejor soporte para esto en el futuro, pero actualmente hay mucho trabajo planificado para las API IKVM.Runtime e IKVM.Java que no queremos inhibir. Dado que también proporcionamos herramientas de compilación para facilitar el proceso de recompilación de ensamblajes desde la máquina de compilación, si se siguen las recomendaciones, esto debería tener un impacto limitado.
Hay excepciones a este consejo, como que la biblioteca no se publique en Maven. En ese caso, la orientación sería recomendar que la biblioteca Java original se publique en Maven, o hacer el trabajo usted mismo, ya que ese es el lugar apropiado para las bibliotecas Java.
No podemos obligarle a seguir este consejo. Pero por la salud del ecosistema, le instamos a que lo tenga en cuenta usted mismo.