在 Kotlin 中为 Spring Boot 项目在 pom.xml 中指定 Main 类

Pra*_*ant 4 maven kotlin spring-boot

我已经Spring Boot使用创建了一个项目Kotlin。我想创建一个.jar包含所有依赖项的文件,以便我可以从命令行运行该应用程序。主类的 FQCN 是:com.example.Application.kt。我的配置中有以下配置pom.xml

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.Application</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

应用程序无法开始抱怨找不到 mainClass。这是异常示例:

Exception in thread "main" java.lang.ClassNotFoundException: com.example.Application
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

Mil*_*owe 6

我只是想自己学习 Kotlin,但我怀疑您可能需要附加Kt到类名的末尾。例如:

<manifest>
    <mainClass>com.example.ApplicationKt</mainClass>
</manifest>
Run Code Online (Sandbox Code Playgroud)

与 Spring 无关,我自己在尝试构建可执行 JAR 时遇到了这个问题。如果您解压 JAR 并查看类文件,我相信您会发现一个ApplicationKt.class.

如果是这样,这是因为您没有main在类中定义该函数。在这种情况下,Kotlin 会生成一个属于<filename>Kt.class您的文件版本的静态方法。根据这个SO答案

与 Java 不同,Kotlin 允许您定义不在类内部的函数。但如果你想让 Java 与 Kotlin 对话,这就成了一个问题。怎么解决呢?将这些函数转换为名为带有“Kt”后缀的文件的类的静态方法

您可以在文档中找到更多相关信息