IKVM é uma implementação de Java para a plataforma Microsoft .NET. Ele pode ser usado de forma rápida e fácil:
Essas tarefas podem ser realizadas sem portar o código-fonte para .NET.
<MavenReference>
, <IkvmReference>
ou ikvmc
.main()
para executar em tempo de execução ao construir usando ikvmc
.java
dentro da imagem JDK Runtime. O bytecode Java é convertido dinamicamente para CIL e executado. A experiência deve ser idêntica a um JDK normal. Existem várias diferenças entre o suporte para todos os nossos diferentes artefatos. Por exemplo, existem algumas plataformas para as quais não podemos distribuir imagens e algumas plataformas para as quais não podemos distribuir ferramentas.
PM> Install-Package IKVM
Ou, para usar MavenReference
:
PM> Install-Package IKVM.Maven.Sdk
As ferramentas estão disponíveis para download na página Releases.
Estão disponíveis imagens de tempo de execução JRE e JDK. Essas imagens são estruturas de diretório padrão JRE ou JDK contendo todas as ferramentas padrão: javac, jdeps, policytool, keytool, etc. Algumas bibliotecas Java podem exigir um JRE ou JDK e, em caso afirmativo, o IKVM.Image.JRE
ou IKVM.Image.JDK
O pacote IKVM.Image.JDK
deve ser adicionado ao seu projeto.
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
Um JDK distribuível independente está disponível para download na página Releases. Essa estrutura de diretório deve ser suficiente como caminho JAVA_HOME
para aplicativos Java padrão.
IKVM suporta integração com projetos estilo .NET SDK, bem como ferramentas de baixo nível para executar código Java compilado diretamente ou para cenários de construção avançados. Os dois principais pontos de entrada para integração com projetos estilo .NET SDK são IkvmReference
e MavenReference
. Projetos no estilo SDK do .NET podem ser criados diretamente na linha de comando ou usando um IDE que os suporte, como versões recentes do Visual Studio ou JetBrains Rider.
O IKVM inclui suporte em tempo de construção para traduzir bibliotecas Java em assemblies .NET. Instale o pacote IKVM
em um projeto que requer referências a bibliotecas Java. Use IkvmReference
em um ItemGroup
para indicar quais bibliotecas Java seu projeto requer.
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
O assembly de saída será gerado como parte do processo de construção do seu projeto e uma referência será adicionada automaticamente ao seu projeto para que você possa chamar APIs do assembly .jar
compilado. Metadados adicionais podem ser incluídos em IkvmReference
para personalizar o assembly gerado.
< 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 >
Os valores a seguir podem ser usados como um atributo ou um elemento aninhado de <IkvmReference>
.
Atributo ou Elemento | Descrição |
---|---|
Include (somente atributo) | A identidade do item IkvmReference . O valor pode ser um dos seguintes:
|
AssemblyName | Por padrão, o AssemblyName é gerado usando as regras definidas pela especificação Automatic-Module-Name . Para substituir isso, faça isso aqui. O valor não deve incluir uma extensão de arquivo, .dll será anexado automaticamente. |
AssemblyVersion | Por padrão, o AssemblyVersion é gerado usando as regras definidas pela especificação Automatic-Module-Name . Para substituir isso, faça isso aqui. |
AssemblyFileVersion | Por padrão, o AssemblyFileVersion é gerado usando as regras definidas pela especificação Automatic-Module-Name ou, se substituído, o mesmo valor que AssemblyVersion . Para substituir isso, faça isso aqui. |
DisableAutoAssemblyName | Se true , desativa a detecção de AssemblyName . |
DisableAutoAssemblyVersion | Se true , desativa a detecção de AssemblyVersion . |
FallbackAssemblyName | Se AssemblyName não for fornecido ou não puder ser calculado, use esse valor. |
FallbackAssemblyVersion | Se AssemblyVersion não for fornecido ou não puder ser calculado, use esse valor. |
KeyFile | Especifica o nome do arquivo que contém a chave criptográfica. Quando esta opção é usada, o compilador insere a chave pública do arquivo especificado no manifesto do assembly e, em seguida, assina o assembly final com a chave privada. |
DelaySign | Esta opção faz com que o compilador reserve espaço no arquivo de saída para que uma assinatura digital possa ser adicionada posteriormente. Use DelaySign se quiser apenas colocar a chave pública no assembly. A opção DelaySign não tem efeito, a menos que seja usada com KeyFile . |
Compile | Uma lista separada por ponto e vírgula de itens do caminho de classe Java para compilar no assembly. Por padrão, esse valor é a Identity do item, se a identidade do item for um arquivo ou diretório JAR existente (ainda não suportado). Os globs do MSBuild têm suporte para fazer referência a vários arquivos JAR ou .class. |
Sources | Uma lista separada por ponto e vírgula de arquivos de origem Java para usar durante a geração da documentação. (ainda não suportado) |
References | Lista opcional separada por ponto e vírgula de outros valores de identidade IkvmReference para especificar como uma referência ao atual. Por exemplo, se foo.jar depender de bar.jar , inclua ambos como itens IkvmReference , mas especifique a identidade de bar.jar nos metadados de References de foo.jar . |
Debug | Valor opcional que indica como gerar símbolos de depuração. Por padrão, isso é determinado com base nas propriedades <DebugType> do projeto. Atualmente, apenas símbolos de depuração completos são suportados. |
Aliases | Uma lista separada por ponto e vírgula de aliases que podem ser usados para fazer referência ao assembly em References . |
ClassLoader | Um nome de classe totalmente qualificado da implementação personalizada do ClassLoader para usar como pai de delegação. Os exemplos incluem ikvm.runtime.AppDomainAssemblyClassLoader e ikvm.runtime.ClassPathAssemblyClassLoader . |
Todos os outros metadados com suporte na definição de grupo de itens Reference do MSBuild. |
IkvmReference
não é transitivo. Incluí-lo em um projeto e adicionar uma dependência a esse projeto a partir de um segundo projeto não resultará na disponibilidade da mesma referência no segundo projeto. Em vez disso, adicione a referência a cada projeto.
Para que cada projeto seja resolvido para a mesma montagem resultante, certifique-se de que suas configurações sejam idênticas.
Várias entradas IkvmReference
podem ser configuradas para incluir umas às outras como referências.
< 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
O Automatic-Module-Name
é um atributo especificado do manifesto JAR, que pode ser encontrado no arquivo META-INF/MANIFEST.MF
dentro do JAR, ou um valor gerado com base no nome do arquivo JAR. Consulte a documentação para obter mais informações.
Consulte o Leiame do ikvm-maven para obter instruções de uso.
O projeto IKVM recomenda que as pessoas não redistribuam bibliotecas FOSS Java compiladas com IKVM em sistemas públicos como NuGet.org, a menos que você seja o proprietário original desse software e tenha um motivo convincente.
Criar cópias de bibliotecas Java FOSS e publicá-las em mecanismos de distribuição como NuGet.org cria confusão no ecossistema e conflitos de dependência a jusante. Fornecemos um sistema para que os usuários .NET de bibliotecas Java possam fazer referência a essas bibliotecas diretamente dos mecanismos padrão do ecossistema Java: Maven Central, etc., por meio do IKVM.Maven. Lembre-se de que poucas bibliotecas existem no vácuo. As bibliotecas geralmente dependem de dezenas de outras bibliotecas. Duas bibliotecas Java não relacionadas geralmente dependem da mesma biblioteca Java subjacente. Um método complexo de resolução de conflitos de dependências e unificação de versões deve estar envolvido na resolução desta hierarquia para qualquer projeto downstream individual. Você provavelmente introduzirá classes duplicadas nos usuários de suas versões ou fará com que seus usuários dependam da versão errada de outras bibliotecas.
Além do acima exposto, atualmente não garantimos que a API entre assemblies compilados estaticamente e as bibliotecas IKVM.Java e IKVM.Runtime permaneça estável. Um assembly compilado estaticamente construído em uma versão do IKVM não tem garantia de execução em uma versão superior do IKVM, mesmo no nível do patch. Gostaríamos de anunciar um suporte melhor para isso no futuro, mas atualmente há muito trabalho planejado para as APIs IKVM.Runtime e IKVM.Java que não queremos inibir. Como também fornecemos ferramentas de construção para facilitar o processo de recompilação de montagens da máquina de construção, se as recomendações forem seguidas, isso deverá ter impacto limitado.
Há exceções a este conselho, como a biblioteca não ser publicada no Maven. Nesse caso, a orientação seria defender que a biblioteca Java original seja de fato publicada no Maven, ou faça você mesmo o trabalho, pois esse é o local apropriado para bibliotecas Java.
Não podemos forçá-lo a seguir este conselho. Mas, para a saúde do ecossistema, pedimos que você mesmo leve isso em consideração.