将Kotlin代码编译为JVM和JavaScript

6

我非常喜欢编写一次框架,然后可以将其编译为jvm字节码以及用于web的javascript。

目前,使用kotlin编译器是否可以实现这一点?

3个回答

7
可以实现,但你可能会遇到一些困难。首先,你只能使用Maven构建和配置它:只需设置两个操作。第二个问题是IDE无法处理多个目标,因此您可以使用技巧启用/禁用stdlib/kotlin-js-library。
你可以在https://github.com/Kotlin/kotlinx.html中查看它。
这是一个多模块项目。jvm模块仅针对JVM进行编译,js模块仅针对javascript进行编译,共享模块针对两者进行编译。
请注意Maven配置文件:当您编辑共享模块时,可以启用js或jvm,但不能同时启用两者,否则IDE将出错。在编译期间,默认情况下同时激活这两个配置文件,因此您将获得多目标jar包。

新的JS/IR编译器中@JsExport怎么样?我必须为Kotlin/JS添加它,但是Kotlin/Java编译器无法识别它。 - Brian White

1
我创建了一个针对JVM的Kotlin Maven项目,可以编译成JVM和JS两种格式。
1. 打开Intellij IDEA -> 文件 -> 新建 -> 项目 -> Maven -> 勾选"从原型创建" -> 选择"org.jetbrains.kotlin:kotlin-archetype-jvm" 2. 编辑GroupId:com.example.training; ArtifactId:kotlin2js; Version:1.0-SNAPSHOT
注意:项目(模块)名称不应包含“ - ”(破折号),但可以使用“ _ ”(下划线)。
  1. Create a class kotlin named Person in path src/main/kotlin/com.example.training/

    data class Person (
        val id, Int,
        val firstname: String)
    
  2. Edit pom.xml

    a) Add dependency "kotlin-stdlib.js"

     <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-js</artifactId>
            <version>${kotlin.version}</version>
     </dependency>
    

    b) Add goal "js" in plugin "kotlin-maven-plugin" enter image description here

    c) (Optional for interoperability Kotlin/JS) Add plugin for unpacking js files needed which are in lib "kotlin-stdlib-js"

          <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.jetbrains.kotlin</groupId>
                                <artifactId>kotlin-stdlib-js</artifactId>
                                <version>${kotlin.version}</version>
                                                  <outputDirectory>${project.build.directory}/js/lib</outputDirectory>
                            <includes>*.js</includes>
                            </artifactItem>
                        </artifactItems>
                        </configuration>
                    </execution>
                </executions>
        </plugin>
    
    1. Run mvn clean compile

    2. Folder classes contains Person.class for java. Folder js contains kotlin2js.js and kotlin2js.meta.js for JS, all js files unpacked are in child folder lib.

enter image description here


0

有段时间这会导致问题。然而这个想法非常好,所以人们继续询问。

请查看我的项目https://github.com/C06A/KUrlet,我就是这么做的:在根级别模块中包含共享代码,并将它的源目录包含到每个子模块(一个针对JVM,另一个为JS)的sourceSets属性中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接