kraal

Kraal enables the use of Kotlin coroutines and GraalVM native-image together

License

License

MIT
GroupId

GroupId

com.hpe.kraal
ArtifactId

ArtifactId

kraal
Last Version

Last Version

0.0.15
Release Date

Release Date

Type

Type

jar
Description

Description

kraal
Kraal enables the use of Kotlin coroutines and GraalVM native-image together
Project URL

Project URL

https://github.com/HewlettPackard/kraal
Source Code Management

Source Code Management

https://github.com/HewlettPackard/kraal

Download kraal

How to add to project

<!-- https://jarcasting.com/artifacts/com.hpe.kraal/kraal/ -->
<dependency>
    <groupId>com.hpe.kraal</groupId>
    <artifactId>kraal</artifactId>
    <version>0.0.15</version>
</dependency>
// https://jarcasting.com/artifacts/com.hpe.kraal/kraal/
implementation 'com.hpe.kraal:kraal:0.0.15'
// https://jarcasting.com/artifacts/com.hpe.kraal/kraal/
implementation ("com.hpe.kraal:kraal:0.0.15")
'com.hpe.kraal:kraal:jar:0.0.15'
<dependency org="com.hpe.kraal" name="kraal" rev="0.0.15">
  <artifact name="kraal" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.hpe.kraal', module='kraal', version='0.0.15')
)
libraryDependencies += "com.hpe.kraal" % "kraal" % "0.0.15"
[com.hpe.kraal/kraal "0.0.15"]

Dependencies

runtime (6)

Group / Artifact Type Version
org.jetbrains.kotlin : kotlin-stdlib-jdk8 jar 1.3.21
org.slf4j : slf4j-api jar 1.7.26
org.ow2.asm : asm jar 7.1
org.ow2.asm : asm-analysis jar 7.1
org.ow2.asm : asm-tree jar 7.1
org.ow2.asm : asm-util jar 7.1

Project Modules

There are no modules declared in this project.

Kraal

Download Build Status

Attempting to use GraalVM and Kotlin coroutines together fails due to a limitation of GraalVM - it cannot handle some perfectly valid bytecode produced by the Kotlin compiler.

Kraal performs "node splitting" on Java bytecode in order to eliminate the irreducible loops produced by the Kotlin compiler that GraalVM doesn't handle. The result is a functionally-equivalent bytecode which can be successfully processed with GraalVM.

Eventually, GraalVM may support irreducible loops, or the Kotlin compiler may add a flag to produce bytecode without them. Until then, Kraal allows the usage of these two technologies together.

Usage

Gradle

Using the Kotlin DSL:

plugins {
    id("com.hpe.kraal") version "0.0.15"
}

The Kraal Gradle plugin by default takes all jars produced by the build and their runtime dependencies, processes them to remove irreducible loops, and leaves processed copies of the jars under build/kraal.

The kraal extension is provided for convenient configuration of the default execution of KraalTask:

kraal {
    input = files(...) // *replace* set of input files
    from(...)          // or, *add* to set of input files

    outputDirectory = file(...)
}

The task and extension expose properties that create a Provider of a zipTree of the processed versions of all of the files. This can be used as a convenient way to create a "fat jar" of the processed classes:

val fatjar by tasks.creating(Jar::class) {
    from(kraal.outputZipTrees) {
        exclude("META-INF/*.SF")
        exclude("META-INF/*.DSA")
        exclude("META-INF/*.RSA")
    }
}

See the example directory for a complete working example with Ktor and GraalVM.

Maven

Use the exec-maven-plugin to execute the Kraal driver application com.hpe.kraal.MainKt:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <dependencies>
        <dependency>
            <groupId>com.hpe.kraal</groupId>
            <artifactId>kraal</artifactId>
            <version>0.0.15</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>java</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <mainClass>com.hpe.kraal.MainKt</mainClass>
                <arguments>
                    <argument>${project.build.directory}/${project.build.finalName}.${project.packaging}</argument>
                </arguments>
                <includePluginDependencies>true</includePluginDependencies>
            </configuration>
        </execution>
    </executions>
</plugin>

See the maven-example directory for a complete working example with Ktor and GraalVM.

com.hpe.kraal

Hewlett Packard Enterprise

Hewlett Packard Enterprise on github; please contact [email protected] for access

Versions

Version
0.0.15
0.0.14
0.0.13
0.0.12
0.0.10
0.0.9